sed-3.62/0000777000076600007660000000000010202633245007235 500000000000000sed-3.62/ABOUT-NLS0000644000076600007660000005132310143704201010377 00000000000000Notes on the Free Translation Project ************************************* Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work at translations should contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. Quick configuration advice ========================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. INSTALL Matters =============== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the GNU `gettext' own library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will respectively bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might be not what is desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages have usually many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. Using This Package ================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your country by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. Translating Teams ================= For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `translation@iro.umontreal.ca' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skill are praised more than programming skill, here. Available Packages ================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of January 2002. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files bg ca cs da de el en eo es et fi fr +-------------------------------------+ a2ps | [] [] [] [] | bash | [] [] [] [] | bfd | [] [] | binutils | [] [] | bison | [] [] [] | clisp | [] [] [] [] | cpio | [] [] [] [] | diffutils | [] [] [] [] [] [] | enscript | [] [] | error | [] [] | fetchmail | () [] [] [] () | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] | flex | [] [] [] | gas | [] | gawk | [] [] | gcal | [] [] | gcc | [] [] | gettext | [] [] [] [] [] | gnupg | [] [] [] [] [] [] | gprof | [] [] | grep | [] [] [] [] [] [] | hello | [] [] [] [] [] [] [] [] | id-utils | [] [] [] | indent | [] [] [] [] | jpilot | () [] [] [] | jwhois | [] [] | kbd | [] | ld | [] [] | libc | [] [] [] [] [] [] [] | lilypond | [] [] | lynx | [] [] [] [] | m4 | [] [] [] [] [] | make | [] [] [] [] | mysecretdiary | [] [] | nano | [] () [] [] [] [] | nano_1_0 | [] () [] [] [] [] | opcodes | [] [] [] | parted | [] [] [] [] | ptx | [] [] [] [] [] | python | | recode | [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] | sh-utils | [] [] [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] | sketch | () [] () | soundtracker | [] [] [] | sp | | tar | [] [] [] [] [] [] | texinfo | [] [] [] [] [] | textutils | [] [] [] [] | util-linux | [] [] [] [] | wdiff | [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | +-------------------------------------+ bg ca cs da de el en eo es et fi fr 0 8 12 31 36 9 1 9 37 15 1 49 gl he hr hu id it ja ko lv nb nl nn +-------------------------------------+ a2ps | () () [] | bash | | bfd | [] | binutils | [] | bison | [] | clisp | [] | cpio | [] [] [] | diffutils | [] [] | enscript | [] | error | [] | fetchmail | | fileutils | [] [] | findutils | [] [] [] [] [] [] | flex | [] | gas | | gawk | [] | gcal | | gcc | [] | gettext | [] | gnupg | [] [] [] | gprof | | grep | [] [] | hello | [] [] [] [] [] [] [] [] [] | id-utils | [] | indent | [] [] [] | jpilot | () () | jwhois | | kbd | | ld | | libc | [] [] [] [] | lilypond | [] [] | lynx | [] [] | m4 | [] [] [] [] | make | [] [] [] [] | mysecretdiary | | nano | [] [] [] () () [] | nano_1_0 | [] [] [] () () [] | opcodes | | parted | [] [] [] | ptx | [] [] [] [] | python | | recode | [] [] [] | sed | [] [] [] [] [] [] [] | sh-utils | [] [] [] [] [] | sharutils | [] [] [] | sketch | () | soundtracker | [] | sp | | tar | [] [] [] | texinfo | [] [] [] | textutils | [] [] | util-linux | () [] | wdiff | | wget | [] [] [] [] [] | +-------------------------------------+ gl he hr hu id it ja ko lv nb nl nn 20 6 1 3 6 11 22 9 1 6 17 4 no pl pt pt_BR ru sk sl sv tr uk zh +-------------------------------------+ a2ps | () () () [] [] [] () | 8 bash | | 4 bfd | [] [] | 5 binutils | [] | 4 bison | [] [] [] | 7 clisp | | 5 cpio | [] [] [] [] | 11 diffutils | [] [] [] | 11 enscript | [] [] [] | 6 error | [] [] | 5 fetchmail | () () | 3 fileutils | [] [] [] [] | 11 findutils | [] [] [] [] [] [] | 17 flex | [] [] | 6 gas | [] | 2 gawk | [] [] | 5 gcal | [] | 3 gcc | [] | 4 gettext | [] [] [] [] | 10 gnupg | [] [] [] | 12 gprof | [] [] | 4 grep | [] [] [] [] [] | 13 hello | [] [] [] [] [] [] [] | 24 id-utils | [] [] | 6 indent | [] [] [] [] | 11 jpilot | () () | 3 jwhois | () () | 2 kbd | [] [] | 3 ld | [] [] | 4 libc | [] [] [] [] [] [] | 17 lilypond | [] | 5 lynx | [] [] [] | 9 m4 | [] [] [] | 12 make | [] [] [] [] | 12 mysecretdiary | [] | 3 nano | () [] [] [] | 12 nano_1_0 | () [] [] [] | 12 opcodes | [] [] | 5 parted | [] [] [] | 10 ptx | [] [] [] [] [] [] | 15 python | | 0 recode | [] [] [] [] | 13 sed | [] [] [] [] [] [] | 21 sh-utils | [] [] [] [] [] [] [] [] [] | 22 sharutils | [] [] | 11 sketch | () | 1 soundtracker | | 4 sp | | 0 tar | [] [] [] [] [] [] [] | 16 texinfo | [] [] | 10 textutils | [] [] | 8 util-linux | [] [] [] | 8 wdiff | [] [] [] [] | 9 wget | [] [] [] [] [] [] | 19 +-------------------------------------+ 35 teams no pl pt pt_BR ru sk sl sv tr uk zh 54 domains 5 12 2 11 25 10 11 39 29 4 1 463 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If January 2002 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. Using `gettext' in new packages =============================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle to use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. sed-3.62/AUTHORS0000644000076600007660000000035310143133571010223 00000000000000GNU Sed, on which super-sed is based, was first authored by Jay Fenlason (hack@gnu.org) and later modified by Tom Lord (lord@gnu.org). It is currently being maintained by Ken Pizzini (ken@gnu.org) and Paolo Bonzini (bonzini@gnu.org). sed-3.62/BUGS0000644000076600007660000001076410176461227007655 00000000000000* ABOUT BUGS Before reporting a bug, please check the list of known bugs and the list of oft-reported non-bugs (below). Bugs and comments may be sent to bonzini@gnu.org; please include in the Subject: header the first line of the output of ``sed --version''. Please do not send a bug report like this: [while building frobme-1.3.4] $ configure sed: file sedscr line 1: Unknown option to 's' If sed doesn't configure your favorite package, take a few extra minutes to identify the specific problem and make a stand-alone test case. A stand-alone test case includes all the data necessary to perform the test, and the specific invocation of sed that causes the problem. The smaller a stand-alone test case is, the better. A test case should not involve something as far removed from sed as ``try to configure frobme-1.3.4''. Yes, that is in principle enough information to look for the bug, but that is not a very practical prospect. * KNOWN BUGS The regular expression routines provided must be checked more thoroughly against the POSIX.2 standard. * NON-BUGS `N' command on the last line Most versions of sed exit without printing anything when the `N' command is issued on the last line of a file. GNU sed instead prints pattern space before exiting unless of course the `-n' command switch has been specified. More information on the reason behind this choice can be found in the Info manual. regex syntax clashes (problems with backslashes) sed uses the Posix basic regular expression syntax. According to the standard, the meaning of some escape sequences is undefined in this syntax; notable in the case of GNU sed are `\|', `\+', `\?', `\`', `\'', `\<', `\>', `\b', `\B', `\w', and `\W'. As in all GNU programs that use Posix basic regular expressions, sed interprets these escape sequences as meta-characters. So, `x\+' matches one or more occurrences of `x'. `abc\|def' matches either `abc' or `def'. This syntax may cause problems when running scripts written for other seds. Some sed programs have been written with the assumption that `\|' and `\+' match the literal characters `|' and `+'. Such scripts must be modified by removing the spurious backslashes if they are to be used with recent versions of sed (not only GNU sed). On the other hand, some scripts use `s|abc\|def||g' to remove occurrences of _either_ `abc' or `def'. While this worked until sed 4.0.x, newer versions interpret this as removing the string `abc|def'. This is again undefined behavior according to POSIX, but this interpretation is arguably more robust: the older one, for example, required that the regex matcher parsed `\/' as `/' in the common case of escaping a slash, which is again undefined behavior; the new behavior avoids this, and this is good because the regex matcher is only partially under our control. In addition, GNU sed supports several escape characters (some of which are multi-character) to insert non-printable characters in scripts (`\a', `\c', `\d', `\o', `\r', `\t', `\v', `\x'). These can cause similar problems with scripts written for other seds. -i clobbers read-only files In short, `sed d -i' will let one delete the contents of a read-only file, and in general the `-i' option will let one clobber protected files. This is not a bug, but rather a consequence of how the Unix filesystem works. The permissions on a file say what can happen to the data in that file, while the permissions on a directory say what can happen to the list of files in that directory. `sed -i' will not ever open for writing a file that is already on disk, rather, it will work on a temporary file that is finally renamed to the original name: if you rename or delete files, you're actually modifying the contents of the directory, so the operation depends on the permissions of the directory, not of the file). For this same reason, sed will not let one use `-i' on a writeable file in a read-only directory (but unbelievably nobody reports that as a bug...). `0a' does not work (gives an error) There is no line 0. 0 is a special address that is only used to treat addresses like `0,/RE/' as active when the script starts: if you write `1,/abc/d' and the first line includes the word `abc', then that match would be ignored because address ranges must span at least two lines (barring the end of the file); but what you probably wanted is to delete every line up to the first one including `abc', and this is obtained with `0,/abc/d'. sed-3.62/COPYING0000644000076600007660000004311010143133571010204 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 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. Copyright (C) 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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) year 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. , 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. sed-3.62/COPYING.DOC0000644000076600007660000004327510143133571010624 00000000000000 GNU Free Documentation License Version 1.1, March 2000 Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other written document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (For example, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent modification by readers is not Transparent. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies of the Document numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has less than five). C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section entitled "History", and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. In any section entitled "Acknowledgements" or "Dedications", preserve the section's title, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section as "Endorsements" or to conflict in title with any Invariant Section. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections entitled "History" in the various original documents, forming one section entitled "History"; likewise combine any sections entitled "Acknowledgements", and any sections entitled "Dedications". You must delete all sections entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an "aggregate", and this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document 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. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have no Invariant Sections, write "with no Invariant Sections" instead of saying which ones are invariant. If you have no Front-Cover Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being LIST"; likewise for Back-Cover Texts. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. sed-3.62/ChangeLog0000644000076600007660000027373110202627247010745 000000000000002005-02-10 Paolo Bonzini * testsuite/appquit.good, testsuite/appquit.inp, testsuite/appquit.sed: New testcase. * testsuite/readin.sed: Quit after the last r command. * testsuite/readin.good: Adjust. * sed/execute.c (execute_program): Dump the results of the a/r/R commands just before quitting. 2005-02-10 Paolo Bonzini * sed/regexp.c: Fix off-by-one error in the "invalid reference to subexpression" message. Debian bug 294339. 2005-02-08 Paolo Bonzini * lib/obstack.h: include config.h. 2005-02-01 Paolo Bonzini * doc/Makefile.am: Don't enable MAKEINFO_HTML and TEXI2HTML_HTML rules unless BUILD_HTML. 2005-01-25 Paolo Bonzini * sed/regexp.c: Fix building on GCC 2.95 and earlier. 2004-12-26 Paolo Bonzini Do not use leftmost-longest matching for addresses. * NEWS: Add a note about this. * testsuite/recall2.good, testsuite/recall2.inp, testsuite/recall2.sed: New test. * testsuite/Makefile.am, testsuite/Makefile.tests: Add the recall2 test. * sed/sed.h (struct regex): New. (struct addr, struct subst, compile_regex, match_regex, release_regex): Use it instead of regex_t. * sed/compile.c (compile_program): Update for new meaning of the third parameter of compile_regex. * sed/execute.c (do_subst): Pass less conservative value to the regsize parameter of match_regex. * sed/regexp.c (compile_regex_1): New, extracted out of compile_regex. The third parameter, needed_sub, now includes \0 (so 10 means that \0 .. \9 are needed). Pass RE_NO_SUB if needed_sub is zero. (compile_regex): Accept a struct regex instead of a regex_t. Save the regular expression's text. (match_regex): Accept a struct regex instead of a regex_t. Recompile the pattern if it was compiled with RE_NO_SUB. (release_regex): Accept a struct regex instead of a regex_t. * doc/Makefile.am: Generate sed.texi correctly when building outside srcdir. 2004-12-26 Paolo Bonzini * doc/sed-in.texi [!PERL]: Likewise. 2004-11-15 Paolo Bonzini * sed/execute.c (str_append_modified): Copy the first character when using \l or \u in a multi-byte configuration. Use WCRTOMB instead of wcrtomb. * sed/sed.h (WCRTOMB): New. 2004-11-11 Paolo Bonzini * tst-rxspecer.c: Do not mix instructions and declarations. * basicdefs.h: Include locale.h before #defining gettext, to avoid breakage under Solaris. * sed/sed.c: do not include locale.h. 2004-10-08 Paolo Bonzini * lib/utils.c (utils_id_s): Renamed to open_files. (struct id): Renamed to struct open_file. 2004-10-08 Jakub Jelinek * testsuite/Makefile.tests (bug-regex*, run-tests, run-ptests): Use $(SED). (version): Likewise; prepend $(SED) invocation with $(SEDENV). 2004-08-16 Paolo Bonzini *** Version 4.1.2 released. 2004-08-06 Paolo Bonzini * sed/compile.c (bad_command): Fix off-by-one error. (snarf_char_class): Fix problem with [.....[] (i.e. last char in class is a bracket. 2004-06-30 Paolo Bonzini *** Version 4.1.1 released. 2004-06-29 Paolo Bonzini * sed/compile.c (mark_subst_opts): Return int. * sed/execute.c (open_next_file): Fix uninitialized variable. 2004-06-10 Paolo Bonzini *** Version 4.1 released. 2004-03-25 Paolo Bonzini * lib/obstack.h: Get current version. 2004-03-13 Paolo Bonzini Exit as soon as possible on an I/O error, and with a better error message. * lib/utils.c (ck_mkstemp, ck_rename, ck_getline): New functions. Save temporary files into utils_id_s. (struct id): Add a field named temp. (ck_fopen): Init the new temp field of struct id. (panic): Unlink temporary files before exiting. * sed/execute.c (read_file_line): Use ck_getline. (closedown): Use ck_rename. (open_next_file): Use ck_mkstemp. 2004-01-20 Paolo Bonzini * sed/sed.h (enum addr_state): New definition. (enum addr_type): Remove ADDR_IS_NUM2. (struct sed_cmd): Replace a1_matched with range_state. * sed/compile.c (next_cmd_entry): Use range_state. (compile_program): Death to ADDR_IS_NUM2. Compile N,Mp as Np if N>=M. * sed/execute.c (match_address_p): Rewritten. Handle ADDR_IS_NUM here. (match_an_address_p): Suit to new match_address_p. (execute_program): Adjust to use range_state in `c'. Handle addr_bang here. (reset_addresses): Use range_state. (struct input): New field "reset_at_next_file". (read_pattern_space): Use it instead of "separate_files". (process_files): Initialize it. 2004-01-17 Paolo Bonzini * sed/sed.h: Do not include wchar.h and wctype.h, and do not include the alloca stuff. * basicdefs.h: Move all that here. 2004-01-15 Paolo Bonzini * sed/regexp.c [REG_PERL]: Use REG_STARTEND instead of regexec2. 2004-01-09 Paul Eggert Paolo Bonzini * sed/sed.h (posixicity): New variable, replaces POSIXLY_CORRECT. * sed/sed.c (main): Set it. * sed/compile.c: Use it instead of POSIXLY_CORRECT. * sed/execute.c: Use it instead of POSIXLY_CORRECT. * doc/sed-in.texi: Document it and --posix. 2004-01-05 Paul Eggert Paolo Bonzini * NEWS: Fix [\n] to match either backslash or n in POSIXLY_CORRECT mode. * doc/sed-in.texi: Document this. Also, document regular expressions a bit better overall, using terminology that's more similar to POSIX. * sed/sed.h (enum text_types): New definition. * sed/compile.c (normalize_text): Replace final parameter with one of type normalize_text. If TEXT_REGEX and in POSIXLY_CORRECT mode, grok character classes without replacing \n inside them. 2004-01-03 Paolo Bonzini * sed/execute.c (execute_program): print final line after executing N, if not POSIXLY_CORRECT. 2003-12-28 Paolo Bonzini * sed/compile.c: fix "\\\n" in RHS of s command. Reported by Mike Castle. * testsuite/bkslashes.inp, testsuite/bkslashes.good, testsuite/bkslashes.sed: New files. * testsuite/Makefile.am, testsuite/Makefile.tests: Add the bkslashes test. 2003-12-16 Paolo Bonzini *** Version 4.0b released. * sed/mbcs.c: New file. * sed/sed.h: Declare macros for mbcs.c. * sed/compile.c: Use them. (brlen): Moved to mbcs.c. * sed/execute.c: Use them. * sed/sed.c: call initialize_mbcs (). 2003-12-14 Paolo Bonzini * sed/regex.c (match_regex): fix memory leak. 2003-11-27 Paolo Bonzini * sed/execute.c (reset_addresses): leave addresses 0 and 0~STEP enabled. 2003-11-15 Jakub Jelinek * sed/regex.c: Use fastmap. 2003-09-21 Paolo Bonzini *** Version 4.0a released. * sed/execute.c (struct line): Add mbstate field. (str_append): Keep mbstate up to date. (str_append_modified): Likewise, and use towupper/towlower. (line_init): Initialize mbstate. (line_copy): Copy mbstate. (line_append): Copy mbstate. 2003-07-15 Stepan Kasal Paolo Bonzini Change the way we treat lines which are not terminated by a newline. Such lines are printed without the terminating newline (as before) but as soon as more text is sent to the same output stream, the missing newline is printed, so that the two lines don't concatenate. * sed/execute.c (output_file): Is now struct output; users adjusted to access the fp field, call output_missing_newline before, and call flush_output afterwards. (read_file_line): Set line.chomped FALSE each time we encounter a line without the newline terminator, no matter whether this is the last input file or not, and no matter whether we are in POSIXLY_CORRECT mode or not. (output_missing_newline): New function which prints the suppressed newline, if necessary. (flush_output): New function for a common pattern. (output_line): Use struct output, set its flag accordingly. (dump_append_queue): Use `ck_fwrite' instead of output_line. (do_list): Flush the output stream at the end. (closedown): The code ``if(separate_files) rewind_read_files();'' (read_pattern_space): ... has been moved here. (process_files): Don't do the default `p' at the end, ... (execute_program): ... as this function is now responsible for it; add the code to the end of the function and to the command `q'; the commands `d', `D' and `Q' thus no longer have to forge an empty line. (execute_program): Commands `c' and `i' no longer call the function output_line with chomped==FALSE; instead, they chomp the text and call the function with chomped==TRUE. (execute_program): Command `e' no longer uses output_line; it calls ck_fwrite directly. Commands `e', `L' and `=' flush the output stream at the end. * sed/compile.c (special_files): Use `struct output' instead of the file name. (get_openfile): ... special files are no longer copied to file_read or file_write. (fp_list): Move to sed.h (users adjusted) and rename as... * sed/sed.h (struct output): ...this. New flag missing_newline associated to the output stream. (struct sed_cmd, struct subst): Use `struct output *' instead of mere `FILE *'; adjust compile.c and execute.c. * testsuite/noeolw.sed, testsuite/noeolw.good, testsuite/noeolw.1good, testsuite/noeolw.2good: New tests 2003-07-15 Stepan Kasal * lib/utils.h, sed/sed.h: #include "basicdefs.h", don't include it from various *.c files. * sed/regex.c: Don't include regex.h as it's included via sed.h. 2003-06-11 Paolo Bonzini * lib/getline.c: Don't realloc with first param = NULL. 2003-05-07 Paolo Bonzini * sed/execute.c: Make treatment of ADDR_IS_NUM_MOD simpler, and fix bugs in 0~5,+1 * sed/compile.c: Complain about addresses like 0 and 0,3 which are sources of misunderstandings. Reported by Akim Demaille 2003-03-25 Paolo Bonzini *** Version 4.0.7 released * sed/execute.c (append_replacement): Extract from do_subst (do_subst): Don't update count when a match was skipped. * testsuite/xbxcx3.good, testsuite/xbxcx3.sed, testsuite/xbxcx3.inp: Regression tests 2003-03-23 Paolo Bonzini * sed/execute.c (do_subst): Fix several bugs with numbered matches * testsuite/numsub2.good, testsuite/numsub2.inp, testsuite/numsub2.sed, testsuite/numsub3.good, testsuite/numsub3.inp, testsuite/numsub3.sed, testsuite/numsub4.good, testsuite/numsub4.inp, testsuite/numsub4.sed, testsuite/numsub5.good, testsuite/numsub5.inp, testsuite/numsub5.sed: regression tests for the bugs 2003-03-15 Paolo Bonzini *** Version 4.0.6 released * lib/mkstemp.c: Include sys/file.h if available for the benefit of Ultrix 2003-03-14 Paolo Bonzini * sed/compile.c: Replace flagT with bool * sed/execute.c: Replace flagT with bool * sed/fmt.c: Replace flagT with bool * sed/sed.c: Replace flagT with bool * sed/regex.c: Replace flagT with bool 2003-03-13 Paolo Bonzini * sed/compile.c (compile_program): Understand parameter of `v'. * sed/sed.c (usage): Split help message into multiple strings (main): Don't understand -h and -V 2003-03-12 Paolo Bonzini * sed/compile.c (match_slash, snarf_char_class): More multibyte character support (brlen): New function * testsuite/classes.good, testsuite/classes.inp, testsuite/classes.sed: New files 2003-03-10 Paolo Bonzini * sed/compile.c (match_slash): Strip the \ in front of slashes (so that the matcher sees x/ for s/x\///). Don't match / and [ unless at the start of a character. 2003-02-18 Paolo Bonzini * sed/regex.c (compile_regex): // matches the last regular expression even in POSIXLY_CORRECT mode. * sed/compile.c (normalize_text): Treat multibyte character sets correctly (read_text): Don't swallow backslash sequences, run text through normalize_text (compile_program): Ditto for y command * sed/compile.c (normalize_text): Add parameter that says whether the text will be processed further to remove more backslash escapes. Callers adjusted (match_slash): Remove same parameter from here. Callers adjusted. 2003-02-15 Paolo Bonzini * sed/sed.h: Fix prototype for match_regex, declare re_registers if REG_PERL * sed/execute.c (do_subst): Use re_registers * sed/regex.c (copy_regs): New function [REG_PERL]: Use re_registers [!REG_PERL]: Avoid using internal entry points, support pre-glibc 2.3 regex for the sake of --without-included-regex. 2003-01-04 Paolo Bonzini * sed/sed.h: Move some stuff from here... * sed/basicdefs.h: ...to here * lib/utils.c (ck_fopen): Add FAIL parameter * lib/utils.h: Adjust parameter * sed/compile.c, sed/execute.c, sed/sed.c: Adjust callers * sed/basicdefs.h: Add TRUE/FALSE * sed/compile.c, sed/execute.c, sed/sed.c: Use them * sed/fmt.c: Do not redefine them 2003-01-02 Paolo Bonzini * sed/sed.c: Bump copyright year 2002-12-24 Paolo Bonzini * sed/sed.c: Use bindtextdomain * sed/basicdefs.h [__EMX__]: Define initialize_main * lib/getline.c [__EMX__]: Strip trailing CR * sed/regex.c: Don't use N_ on the lines that define error messages, some compilers complain. 2002-12-18 Paolo Bonzini *** Version 4.0.5 released * sed/compile.c: Don't use N_ on the lines that define error messages, some compilers complain. 2002-12-16 Paolo Bonzini * sed/compile.c: Improvements to some error messages; `a', `i', `l', `L', `r' accept two addresses except in POSIXLY_CORRECT mode. 2002-12-14 Paolo Bonzini * lib/regex_internal.c: Fix problem on non-glibc systems, from Jakub Jelinek * lib/regex.c (RE_ENABLE_I18N): Conditionalize on HAVE_MBRTOWC and HAVE_WCRTOMB. * lib/getline.c: Fix compilation on non-glibc system * lib/snprintf.c: Fix compilation on non-glibc system * lib/basicdefs.h [P_]: Make more portable 2002-12-12 Paolo Bonzini *** Version 4.0.4 released 2002-11-21 Paolo Bonzini *** Version 4.0.3 released 2002-11-19 Paolo Bonzini *** Version 4.0.2 released 2002-11-05 Paolo Bonzini *** Version 4.0.1 released 2002-10-23 Paolo Bonzini *** Version 4.0 released 2002-10-28 Paolo Bonzini * lib/utils.c: Don't fail for EBADF in fflush * src/sed.c: the_program is now a global 2002-10-19 Paolo Bonzini * src/sed.c: Print GNU sed in --version for GNU sed, and super-sed for super-sed (thanks to Bruno Haible) 2002-10-17 Paolo Bonzini *** Version 3.96 released 2002-10-16 Isamu Hasegawa * src/execute.c (execute_program): Multibyte 'y' * src/compile.c (compile_program): Likewise * src/sed.h: Likewise 2002-10-08 Paolo Bonzini *** Version 3.95 released 2002-07-15 Paolo Bonzini * src/sed.h: rfile --> fname, wfile --> fp * src/compile.c (compile_command): Parse 'R' like 'w', use separate lists for file read and file write * src/compile.c (get_openfile): New name of get_writefile * src/compile.c (rewind_read_files): New function * src/sed.h: Declared here * src/execute.c (closedown): And called here * src/execute.c (append_queue): Added 'free' field * src/execute.c (execute_program): Implement 'R' 2002-06-09 Paolo Bonzini * src/execute.c (do_subst): Replaced flag was set on every regexp match, while the first matches should not set it for s///N. 2002-06-08 Paolo Bonzini * src/compile.c (compile_file): Open the script in text mode * lib/utils.c (utils_fp_name): Shorten the output * lib/utils.c (ck_fread, ck_fwrite, ck_fflush): Clearerr after printing an error. * lib/utils.c (ck_fclose): Work on stdout as well if stream == NULL and flush before closing to check for errors 2002-05-30 Paolo Bonzini * src/compile.c (compile_program): Implement W * src/execute.c (execute_program): Likewise 2002-04-23 Paolo Bonzini * src/sed.c (usage, main): Parse -s * src/sed.h (separate_files): New variable * src/execute.c (separate_files): New variable * src/execute.c (reset_addresses): New function to make range addresses work separately on each file when using in-place editing * src/execute.c (execute_program): The `n' and `N' use test_eof so that the script restarts at end of file, not at end of input * src/execute.c (test_dollar_EOF): Make $ work separately on each file when using -s; renamed to test_eof 2002-02-28 Paolo Bonzini * src/sed.h (struct sed_cmd): exit_status -> int_arg * src/compile.c: Likewise * src/execute.c: Likewise * src/compile.c (compile_command): Parse `l' like `q' and `Q'; default for int_arg is -1 * src/execute.c (do_list): New argument, used instead of lcmd_out_line_len (execute_program): Interpret int_arg for the `l' command; return 0 for `q' and `Q' if int_arg is -1 * src/fmt.c: New file, looted from GNU textutils * src/compile.c: Parse `L' * src/execute.c: Execute `L' 2002-02-14 Paolo Bonzini * src/execute.c (str_append_modified): Fixed a stupid bug (stop condition was *start == *end, meant to be start == end) 2002-02-05 Paolo Bonzini * lib/utils.c: Added directory parameter to temp_file_template * lib/utils.h: Adjusted * src/execute.c: Adjusted 2002-01-29 Paolo Bonzini * src/compile.c (mark_subst_opts): Signal an error if there are multiple g or p options * src/compile.c (compile_program): Raise appropriate error if second string in y command is longer than first (used to be "excess junk after command") 2001-12-31 Paolo Bonzini * lib/getline.c: Strip the terminating \r under Windows or MS-DOS. * testsuite/xemacs.sed, testsuite/xemacs.inp, testsuite/xemacs.good: Submitted by John Fremlin (john@fremlin.de) 2001-12-27 Paolo Bonzini * sed/execute.c (do_subst): Flags in optimized s/^xx/ commands were discarded (see the change below) 2001-12-19 Paolo Bonzini * sed/execute.c (resize_line): Limit inactive space to two thirds of a buffer * sed/execute.c (line_init): Initialize buf->active * sed/execute.c (str_append, str_append_modified, line_copy, do_list, do_subst, execute_program, process_files): Operate on active space * sed/execute.c (do_subst): Optimize s/^xx// by making a part of the buffer inactive and s/xx$// by truncating it. * sed/execute.c (execute_program): Optimize D by making a part of the buffer inactive * testsuite/uniq.sed, testsuite/uniq.inp, testsuite/uniq.good: added to test P and D commands. * testsuite/fasts.sed, testsuite/fasts.inp, testsuite/fasts.good: added to test the new optimization done on the `s' command. 2001-12-17 Paolo Bonzini * testsuite/dc.inp: Also compute Easter of 2002 :-) * sed/execute.c [!HAVE_FCHMOD]: Don't chmod the output file if working in-place 2001-11-12 Paolo Bonzini * sed/sed.h (struct sed_cmd): a1 is a pointer too * sed/compile.c: Likewise * sed/execute.c: Likewise * sed/compile.c: Use obstacks * sed/execute.c: Likewise 2001-11-09 Paolo Bonzini * sed/compile.c (mark_subst_opts): Parse option `e', preserve two occurrences of the `e' and `p' options. * sed/execute.c (do_subst) [HAVE_POPEN]: Interpret option `e' (evaluate, like Perl's but uses Bourne shell). * sed/sed.h (struct subst): Add an `eval' flag. * sed/compile.c (compile_program): Compile command `e' like `c'. * sed/execute.c (execute_program): Execute command `e'. 2001-09-25 Paolo Bonzini * sed/compile.c (get_writefile) [!POSIXLY_CORRECT]: support /dev/stdout * sed/execute.c (open_next_file, closedown): Support in-place editing * sed/execute.c (backup_file_name): New function to support in-place editing * sed/main.c (usage, main): Parse -i. * sed/utils.c: Moved to lib directory * lib/utils.c (temp_file_template): New function. * sed/utils.h: Declared temp_file_template. 2001-09-05 Paolo Bonzini * sed/execute.c (do_subst): `baaac', if passed through s/a*/x/g, gave `xbxxcx' rather than `xbxcx' (because an empty string matched before the `c'. Fixed. * sed/execute.c: Removed mmap support, I/O is done using getline (slower but more bug-proof). * sed/utils.c: Likewise. * lib/getline.c: New file 2001-03-22 Paolo Bonzini * sed/compile.c (normalize_text) [POSIXLY_CORRECT]: Enable escapes in modes other than BRE. 2001-03-21 Paolo Bonzini * sed/compile.c (normalize_text): Support \XXX in Perl mode, \oXXX in non-Perl mode. 2001-03-18 Paolo Bonzini * sed/compile.c (compile_program): Fixed missing break when compiling 'q' and 'Q'. * sed/compile.c (check_final_program): Removed now spurious call to compile_regex * sed/regex.c (compile_regex): Don't track the last compiled regex * sed/regex.c (execute_regex): Track here the last compiled regex 2001-03-02 Paolo Bonzini * sed/compile.c (setup_replacement): Support \[lLuUE] like Perl and vi. * sed/compile.c (new_replacement): Accept new parameter to support \[lLUuE]. * sed/sed.h (enum replacement_types): New declaration * sed/execute.c (do_subst): Use new function str_append_modified to apply the changes required via \[lLUuE]. * sed/execute.c (str_append_modified): New function 2001-03-02 Paolo Bonzini * sed/compile.c (setup_replacement): Count the number of backreferences that the RHS needs * sed/regex.c (compile_regex): Check if there is a sufficient number of backreferences (new argument needed_sub replaces nosub) * sed/compile.c (compile_address, compile_program, check_final_program): Callers adjusted 2001-02-08 Paolo Bonzini * sed/compile.c (compile_program): Added `Q' (quit without output) * sed/execute.c (execute_program): Ditto * sed/compile.c (compile_program): Fill in exit_status for `q' and `Q' * sed/execute.c (execute_program): Return -1 for `go on', 0..255 to set the exit status * sed/execute.c (process_files): Interpret new convention for execute_program, return sed's exit code * sed/sed.c (main): Return process_files's exit code * sed/sed.h (struct sed_cmd): Declare exit_status 2001-01-07 Paolo Bonzini * sed/compile.c (compile_program): Added `T' (branch if failed) * sed/execute.c (shrink_program, execute_program): Ditto 2001-01-04 Paolo Bonzini * testsuite/Makefile.am: Use automake's implementation of `make check'. Removed the test targets * testsuite/Makefile.tests: Moved the test targets here (new file). * testsuite/runtest: New file * testsuite/Makefile.tests: `khadafy' test uses EREs. * testsuite/spencer.inp: Removed the ^* test * testsuite/spencer.sh: Don't rely on awk; more comments too 2001-01-03 Paolo Bonzini * sed/compile.c(snarf_char_class) [REG_PERL]: Don't parse `\n' specially * sed/compile.c(match_slash) [REG_PERL]: Ditto * sed/compile.c(read_text) [REG_PERL]: Support [xX] modifiers * sed/compile.c(mark_subst_opts) [REG_PERL]: Ditto 2000-12-21 Paolo Bonzini * lib/snprintf.c [BOOTSTRAP]: Don't include stdio.h * lib/strerror.c [BOOTSTRAP]: Don't include stdio.h * sed/execute.c [!HAVE_ISATTY]: Don't buffer stdin 2000-12-11 Paolo Bonzini * sed/compile.c(mark_subst_opts): Support [mMsS] flags * sed/compile.c(read_text): Support [MS] flags for addresses * sed/regex.c(compile_regex): Support arbitrary flags for regncomp. * sed/regex.c(compile_regex) [REG_PERL]: Don't call normalize_text. 2000-12-08 Paolo Bonzini * basicdefs.h: Moved here from the `sed' subdirectory. * configure.in: Removed crap to pick a regex engine. Added snprintf to the AC_REPLACE_FUNCS call. * lib/snprintf.c: New file. * sed/regex.c(compile_regex): Use regncomp * sed/regex.c(match_regex): Use regexec2 * sed/compile.c(compile_program): Implemented the `v' command. * sed/sed.c(main): Implemented the `r' and `R' options * sed/sed.h: Replaced use_extended_syntax_t with extended_regexp_flags to support Perl regular expressions. * sed/execute.c(open_next_file): Don't mmap stdin (because we cannot seek into it, so a redirected stdin's contents would not be "eaten" by sed) Mon Aug 30 23:40:08 PDT 1999 Ken Pizzini *** Version 3.02.80 released * sed/execute.c(do_subst): lib/regex.c(re_search_2) seems to want one extra backreference register; humor it. * sed/regex.c(compile_regex): work around some odd assumptions that lib/regex.c(re_compile_pattern) makes about our desired RE syntax. * configure.in: tweaked version to 3.02.80; added new entries to the ALL_LINGUAS definition. * doc/sed.1, doc/sed.texi, BUGS: explicitly request the output of sed --version in bug-reporting instructions. * doc/sed.texi: the old "informal seders list" is dead; document the new sed-users mailing list instead (under Other Resources). Thu Aug 19 23:27:54 PDT 1999 Ken Pizzini * sed/sed.h: Add explicit #include of "regex-sed.h" (rather than relying on parent file doing so); change the "cmd_regex" member of sed_cmd: make it a pointer (instead of a struct), and change its name to cmd_subst; add prototypes for newly exported functions bad_prog(), normalize_text(), compile_regex(), match_regex(), and release_regex(); drop rx_testing variable. * sed/compile.c: move the compile_regex() function to regex.c; export bad_prog() and normalize_text() functions; eliminate the rx_testing debris; rename the NOLEAKS symbol to more descriptive DEBUG_LEAKS; make cmd_regex to cmd_subst fixes (see above); make use of newly abstracted release_regex() function. * sed/execute.c: abstract out the regex matching to regex.c:match_regex(); NOLEAKS to DEBUG_LEAKS change; cmd_regex to cmd_subst structure member name change. * sed/execute.c(do_subst): use re_registers/regoff_t instead of regmatch_t to hold the backreference registers, make "offset" always be relative to the beginning of the string (rather than a delta from "start"), defer some matching bookkeeping (e.g., not_bol_p) to match_regex(). * sed/sed.c(main): loose rx_testing variable; NOLEAKS (aka DEBUG_LEAKS) code attempting to release _nl_current_default_domain is problematic, so omit it. * sed/regex.c: new file --- abstracts out the interface to the regex engine so that less conditional code is required in compile.c and execute.c, and so as to make a change of engine easier; implements compile_regex() (which looks an awful lot like the one that used to live in compile.c), match_regex(), and (if DEBUG_LEAKS is set) release_regex(). Sun Apr 18 04:40:46 PDT 1999 Ken Pizzini * sed/sed.c(main): conditionalize calls to setlocale() and textdomain() to only occur if their support is needed/wanted. Sun Apr 18 03:01:46 PDT 1999 Ken Pizzini * bootstrap.sh: "foo || bar && baz" was not grouping like I expected ("foo || (bar && baz)") under at least one shell, so change the test for a pre-existing config.h file to an if statement. * bootstrap.sh: added -DUSE_REGEX_GNU_H option to the compiler invocation, to ensure that we get a usable regex library included. Sun Apr 18 02:59:42 PDT 1999 Ken Pizzini * sed/sed.h, sed/utils.c: conditionalized inclusion of to occur only if ENABLE_NLS is defined. Sun Apr 18 01:48:45 PDT 1999 Ken Pizzini * sed/compile.c(xofa,normalize_text,convert_number): change name of xofa() function to convert_number(); change semantics to do all of the work of the text->number conversion. * sed/compile.c(normalize_text): add new \dDDD decimal and \oOOO octal escapes. Sun Mar 28 21:05:07 PST 1999 Ken Pizzini * sed/sed.c(main): if NOLEAKS is set, free up a word that the call to textdomain() allocated. * sed/execute.c(read_file_line): plug up (minor) memory leak: if buffer.alloc==0 we may have malloc()'d 1 byte anyway, so be sure to FREE(buffer.text) before calling line_init(); Fri Mar 26 16:52:10 PST 1999 Ken Pizzini * sed/compile.c(match_slash): somewhere between 3.02 and 3.02a we lost the ability to use a newline as the s/// delimiter; restore this ability. * sed/compile.c(compile_regex): forget about trying to cache the compiled form of the last RE --- it causes more problems than its worth. We now only cache the source form. * testsuite/help.good: update to reflect output containing new options. Sun Dec 6 00:51:23 PST 1998 Ken Pizzini * sed/utils.c(ck_fwrite): fix i18n bug of using a printf fragment of "item%s" to handle plural text. Mon Nov 23 11:03:40 PST 1998 Ken Pizzini * doc/sed.1, doc/sed.texi: ran ispell over these files to catch the more obvious typos... Sun Nov 1 00:09:07 PST 1998 Ken Pizzini * sed/execute.c(do_list): make a `lcmd_out_line_len' (--line-length) of zero mean "infinite length", i.e., "never wrap". Sat Oct 31 23:06:50 PST 1998 Ken Pizzini * execute.c(match_an_address_p,process_files), compile.c(compile_program): back out the "zero-address" changes of 1998-09-27. It was a neat idea, but there are too many dark corners which don't work well. The special code for handling line ranges starting at address zero (from 1998-08-31) are still there though: this seems to work fine with no surprises. Sat Oct 31 22:18:59 PST 1998 Ken Pizzini * sed/sed.c, sed/sed.h, sed/execute.c: added new `lcmd_out_line_len' variable. (Idea suggested by Carlos J. G. Duarte .) Also added ATOI macro (which uses strtoul() if available, with fall-back to atoi()). * sed/sed.c(main): attempt to use COLS environment variable to set a reasonable `lcmd_out_line_len'; added -l/--line-length command-line options to set the new `lcmd_out_line_len' flag. * sed/sed.c(usage): documented new -l/--line-length options. * sed/execute.c(do_list): use `lcmd_out_line_len' variable instead of `LCMD_OUT_LINE_LEN'. * sed/execute.c: deleted now obsolete LCMD_OUT_LINE_LEN define. * configure.in: added strtoul to the AC_CHECK_FUNCS call. Sat Oct 31 21:37:17 PST 1998 Ken Pizzini * sed/sed.c, sed/sed.h, sed/execute.c: added new `force_unbuffered' flag. (Idea suggested by Frank Strauss .) * sed/sed.c(main): added -u/--unbuffered command-line options to set the new `force_unbuffered' flag. * sed/sed.c(usage): documented new -u/--unbuffered options. * sed/execute.c: changed the name of the `is_tty' flag in struct input to a more generic `no_buffering'; also removed HAVE_ISATTY conditional on this member. * sed/execute.c(slow_getline): removed HAVE_ISATTY conditonal compilation of this function. * sed/execute.c(output_line): if force_unbuffered is set, then force a fflush() even if writing to stdout. * sed/execute.c(open_next_file): added handling of the new `force_unbuffered' flag so that slow_getline() will always be used for input. * sed/execute.c(read_file_line): changed the (conditionally compiled) test of `input->is_tty' to (unconditionally) use the new spelling `input->no_buffering'. Thu Oct 15 12:08:09 PDT 1998 Ken Pizzini * configure.in: deleted AC_ARG_PROGRAM call; this is already done for us by AM_INIT_AUTOMAKE, and we were winding up with a doubled-transform. Sun Sep 27 01:42:42 PDT 1998 Ken Pizzini * compile.c(compile_program): remove special-case code for matching address range with a `0' beginning. * compile.c(compile_address): change default addr_number to be a pragmatically impossible countT value, instead of zero. * execute.c: spell macro REGNEXEC() unconditionally instead of playing with conditional definition of regnexec() macro. * execute.c(match_an_address_p): added third argument (and changed callers in match_address_p). Added special code to ignore non-numeric matches when processing "line zero". * execute.c(process_files): added a "line zero" pass through the commands script. Sun Sep 27 00:20:53 PDT 1998 Ken Pizzini * compile.c(xofa,normalize_text): new functions. * compile.c(compile_regex): cache last_compiled_re (with its associated flags); add POSIXLY_CORRECT behavior for empty RE. Make use of the new normalize_text() function. * compile.c(setup_replacement): Make use of the new normalize_text() function. Sat Sep 26 22:59:13 PDT 1998 Ken Pizzini * lib/regex-gnu.h: added missing prototype for regncomp(). Mon Sep 14 20:47:23 PDT 1998 Ken Pizzini * sed/sed.c(main): use EXIT_SUCCESS instead of 0, in case we are built on a system (such as VMS) where EXIT_SUCCESS is distinct from 0. Wed Sep 9 22:17:28 PDT 1998 Ken Pizzini * sed/Makefile.am: added -I../intl the INCLUDES line; if we are building in a directory outside the source tree and the system we are building on does not have a header, then the build was failing, because libintl.h is a build-time constructed source file. * configure.in: tweaked version to be 3.02b. Wed Sep 9 19:28:14 PDT 1998 Ken Pizzini *** Version 3.02a released * sed/compile.c(mark_subst_opts,read_label,compile_program): wherever we accept a ; as a command terminator, also allow a } or a # to appear. (This allows for less cluttered-looking scripts, such as: sed '/foo/{x;G}' (instead of: sed '/foo/{x;G;}').) Wed Sep 9 18:17:07 PDT 1998 Ken Pizzini * sed/compile.c(compile_regex): use regncomp() instead of regcomp(), so that a script with NULs in its REs will work in the expected manner. * sed/compile.c(ADDNUL,REGNCOMP): added support macros for above. * lib/regex.c(regncomp,regcomp): added regncomp() and made regcomp() a simple wrapper function. Mon Aug 31 21:48:30 PDT 1998 Ken Pizzini * sed/sed.c(compile_program): if the first address of a range is the number 0 (or a 0~N sequence), start out in the "a1_matched" state. This allows one to match an initial chunk of a file without undue convolutions for handling the case where the match for the end of the sequence happens to be the first line. Sun Aug 16 03:34:25 PDT 1998 Ken Pizzini * sed/compile.c(snarf_char_class,match_slash): simplify handling of "premature newline" error. Also, get the line number right in the error message if we encounter a "premature newline" during char-class snarfing. Sun Aug 16 02:59:20 PDT 1998 Ken Pizzini * sed/compile.c: added N_() markers and corresponding gettext() (er, _()) calls. * Merged in i18n contribution from Erick Branderhorst . His ChangeLog entry for the changes I've incorporated so far: 1998-07-24 Erick Branderhorst * configure.in (ALL_LINGUAS, AM_GNU_GETTEXT): nl * sed/{sed.h,utils.c}: #include #define _(String) gettext (String) * sed/sed.c: #include * po/POTFILES.in: sed/{compile,execute,sed,utils}.c * run gettextize -f * acconfig.h: #undef LOCALEDIR ENABLE_NLS HAVE_CATGETS HAVE_GETTEXT HAVE_LC_MESSAGES HAVE_STPCPY Fri Aug 14 13:52:57 PDT 1998 Ken Pizzini * Merged code from 3.02 with a branched development tree from late May; the following (out-of-order) changelog entry is from the branched tree. Sat May 30 12:23:16 PDT 1998 Ken Pizzini * sed/compile.c, sed/execute.c: added (conditional on NOLEAKS macro) code to free all dynamically allocated memory. * sed/sed.c, sed/compile.c, sed/execute.c: much shuffling of code --- ordered functions such that no forward declarations are necessary, and placed all static prototypes immediately before the actual function definition. This accomplished two things: first, I find the new ordering a more natural way to read the code than the previous ordering, and second, the new ordering give the compiler a better opportunity to discover inlining possibilities. (The odd "prototype declaration+old-style definition" style is used because I feel it is the least ugly way of supporting K&R1 C while still getting the benefit of prototypes when they are available.) * sed/basicdefs.h: added MEMCPY() macro to hide the VCAST()s that ought to be used with memcpy(). * sed/execute.c: Change calls to memcpy() to go through the new MEMCPY() macro. Various prototypes: elide variable name if it does not add any human-useful documentary information to the bare type. * sed/sed.c(main): Updated calls to compile_string() to add third (length) argument. Changed call to obsolete close_all_files() to a call to the new finish_program(). * sed/sed.c(map_file): Attempt to clean-up how "size" gets cast and tested; remove spurious S_ISREG test (just let mmap() fail if it doesn't support the underlying file type). * sed/sed.c: Deleted old RX library stub declarations. * sed/sed.c(map_file,unmap_file): added VCAST()s to the mmap()/munmap() calls. * sed/utils.c(ck_fclose): added support for ANSI C functionality where passing a NULL argument means to fclose() _all_ open streams. (Well, almost. Only closes streams which were previously ck_fopen()ed, as I don't care to figure out how to autoconf-detect whether fclose(NULL) is properly supported on a given platform.) * sed/sed.h: Renamed `struct text_buf' member `text_len' to `text_length'. Abstracted out `enum addr_types' from `struct addr'; added new enum types num2,step,step_mod; renamed mod to num_mod. De-unionized the regex,number, {modulo-offset/step} components of `struct addr', in anticipation of new features. Changed type of `a2' member of `struct sed_cmd': now a pointer to save space. Abstracted out `struct replacement' from `struct subst'. Cleaned up declaration of `x' union of `struct addr'. Fixed prototype for compile_string(). Replaced prototype for old close_all_files() with one for new finish_program(). * sed/sed.h, sed/compile.c, sed/execute.c: changed to simplify the data structures used for branches and command blocks: simplified `struct vector'; made `struct label' local to compile.c; `struct sed_cmd' was modified to support a simpler design for branches and blocks. * sed/execute.c: Conditionally added ADDNUL() macro so that the function call overhead is only incurred if nul_append() _must_ be called. Made some commentary edits, including typo fixes. * sed/execute.c(resize_line): changed semantics of "len" argument from "additional length" to "target length"; made INITIAL_BUFFER_SIZE a minimum allocation length. * sed/execute.c(str_append): adjusted to new resize_line() semantics. * sed/execute.c(line_copy): use FREE()+MALLOC() instead of REALLOC() to avoid unnecessary copying of old text; add the "try doubling first" allocation heuristic (just like resize_line() does). * sed/execute.c(line_exchange): new function. * sed/execute.c(nul_append): make whole function (not just its body) conditional on HAVE_REGNEXEC macro; adjust to new resize_line() semantics. * sed/execute.c(read_mem_line): use str_append() instead if custom in-line code; compensate for new default of "line.chomped = 0" in read_pattern_space() by setting "line.chomped = 1" where appropriate. * sed/execute.c(read_file_line): use different trigger to determine that "buffer" is uninitialized, and do a full initialization if required; use str_append() instead of custom in-line code in two places; compensate for new default of "line.chomped = 0" in read_pattern_space() by setting "line.chomped = 1" where appropriate. * sed/execute.c(output_line): don't bother calling ck_fwrite() if length==0. * sed/execute.c(release_append_queue): new function. * sed/execute.c(dump_append_queue): use release_append_queue() instead of in-line equivalent. * sed/execute.c(read_pattern_space): conditionalize call to dump_append_queue() for alleged performance reasons; changed default "line.chomped" value to more common "1", and added an assignment of "0" where this made a difference. * sed/execute.c(match_an_address_p): deleted "is_addr2_p" argument; reorder cases to match order in enum declaration; add cases for new "addr_is_num2", "addr_is_step", and "addr_is_step_mod" address types; alter nul_append() call to be through ADDNUL() macro; fix to new struct member and enum spellings in (formerly addr_is_mod); addr_is_num_mod case. * sed/execute.c(match_address_p): remove oblsolete third argument to calls to match_address_p(); alter references to sed_cmd member a2 to reflect new pointer status; add new support for a2->addr_type addr_is_step and addr_is_step_mod cases. * sed/execute.c(do_subst): add NOLEAKS support logic; use ADDNUL() wrapper to nul_append(); simplify replacement expansion by using the new "struct replacement" data structure; use line_exchange() function instead of custom in-line code. * sed/execute.c(process_files): added NOLEAKS code. * sed/execute.c(execute_program): updated implementations of the `{', `}', `:', `b', and `t' commands; modified `c' command gratuituosly; fixed potential memory overrun in `D' command. Simplified how nonstandard `loop increments' work. Use line_exchange() instead of custom in-line code in 'x' case. * sed/execute.c[EXPERIMENTAL_DASH_N_OPTIMIZATION conditional code]: various modifications intended to keep this code in sync with the new changes, but the code still retains its previous bugs. * sed/compile.c: use "exit(EXIT_FAILURE) instead of "exit(1)", just in case we get compiled under VMS. * sed/compile.c: Change type of prog_info.base to decrease needs for casting; then elimiated the casts in question ;-). * sed/compile.c: Added struct sed_label (moved from sed.h, then modified). * sed/compile.c: Removed "readit_p" flag from struct fp_list. * sed/compile.c: Added module-global "blocks" variable. * sed/compile.c: Extracted more error-message constant strings to named variables. * sed/compile.c(check_final_program): updated to reflect new data structures and use new fucntions. Added call to compile_regex() to release unneeded memory. * sed/compile.c: deleted obsolete new_vector() function; abstracted new read_label() function; abstracted new release_label() function; added new `blocks' module-static variable. * sed/compile.c(compile_program): updated implementations of the `{', `}', `:', `b', and `t' commands; modified initialization from NULL vector. * sed/compile.c(compile_regex): added mechanism to release memory consumed by the cached `last' RE. * sed/compile.c(setup_jump,setup_label): updated name (from setup_jump to setup_label) and prototype; changed body to reflect data structure changes. * sed/compile.c: Add OPEN_BRACE and CLOSE_BRACE macros for better "vi" editing behavior. * sed/compile.c(compile_filename,read_filename,get_writefile): Replaced function compile_filename() with more orthogonal functions read_filename(), get_writefile(). * sed/compile.c(compile_regex): Added ability to free the remembered "last RE" in compile_regex (for benifit of "NOLEAKS" code). * Made adjustments dictated by the change to struct sed_cmd which made the a2 member a pointer-to-addr instead of an addr. * sed/compile.c(setup_jump,read_label,setup_label,release_label): Added functions read_label(), setup_label(), release_label(); deleted function setup_jump(). * sed/compile.c(new_replacement,setup_replacement,release_replacement): new functions. * sed/compile.c: Adjusted to new spelling of text_buf member ("text_length" instead of "text_len"). * sed/compile.c(new_vector): deleted function. (Due to new handling of blocks, only one instance remained, and that one was just as clear in-lined.) * sed/compile.c(compile_string): Added third argument; it now takes a counted string instead of a NUL-terminated string. * sed/compile.c(compile_file): added variable "map_base" to compensate for new type of prog_info.base. * sed/compile.c(check_final_program): reflect new style of handling blocks and struct sed_label. * sed/compile.c(close_all_files,finish_program): replaced function close_all_files() with more generic finish_program(). * sed/compile.c(read_text): added new feature: if first non-blank character after the {a,i,c} command character is not "\", then use the trailing text on that line as the (first) line of text. Also added code conditional on NO_INPUT_INDENT to support the "feature" of stripping leading blanks from each input line; I do not read POSIX as permitting this behavior, nor do I think it is a good idea, so it is disabled by default, but some have argued that this blank-stripping is the "correct" behavior, so I offer them the option of building their sed that way. * sed/compile.c(compile_address): added xxx,+n and xxx,~n addressing; simplified code. * sed/compile.c(compile_program): added BAD_PLUS error detection; adjusted to new cur_cmd->a2 pointer status; added addr_is_num2 detection; deleted pointless "a2->addr_number < a1.addr_number" check (addr_is_num2 semantics handle this just fine); updated code for '{', '}', ':', 'b', and 't' to reflect new design of branch handling, including making use of new functions related to the new design); added support for feature already mentioned in read_text() where {a,i,c} commands are able to have their text start on the same line as the command; changed some error messages (hopefully for the better); localized variables specific to individual commands (particularly 's' and 'y'); made use of new setup_replacement() function in 's' command. Mon Aug 10 19:58:49 PDT 1998 Ken Pizzini * doc/sed.texi, doc/sed.1: sedtut10.txt is apparently dead. Deleted references to it and added a pointer to http://seders.icheme.org/tutorials/. (Pointed out by Joerg Heitkoetter .) Sat Aug 8 18:11:57 PDT 1998 Ken Pizzini * djgpp/config.btm: per request by Michel de Ruiter , added "%1" to "%9" parameters. Mon Aug 3 11:44:55 PDT 1998 Ken Pizzini * doc/sed.texi: fix a couple of typos. (Submitted by Alan Modra .) Sat Aug 01 17:49:06 PDT 1998 Ken Pizzini *** Version 3.02 released * configure.in: Because of code change in 3.01a, bump the minor revision number for the release (now 3.02). Sun Jul 26 16:07:55 PDT 1998 Ken Pizzini *** Version 3.01a released * sed/compile.c(snarf_char_class): the POSIX char-class recognition loop forgot to update its concept of "prev" as the loop progressed. * testsuite/Makefile.am: The dependency of version.good on [testsuite/]Makefile introduced in the previous release was botched -- it referred to "Makefile" as "$(srcdir)/Makefile, which of course doesn't work if you aren't building in the source tree. * djgpp/Makefile.am: add forgotten "config.btm" EXTRA_DIST member. * configure.in: update version. Tue Jul 21 06:04:42 PDT 1998 Ken Pizzini *** Version 3.01 released * configure.in: mark as release version! * Makefile.am: add BUGS and THANKS to the EXTRA_DIST target. * testsuite/Makefile.am: add dependency of version.good on [testsuite/]Makefile. Mon Jul 20 12:38:10 PDT 1998 Ken Pizzini * djgpp/config.btm: New file to support the 4DOS alternative to command.com. (Sumitted by Eli Zaretskii on behalf of an anonymous 4DOS user.) Fri Jul 17 00:36:34 PDT 1998 Ken Pizzini *** Version 3.01-beta18 released * djgpp/config.sed: my "tweak" in beta17 was too hastily considered. Back it out. * configure.in: update to beta18. Wed Jul 15 01:02:15 PDT 1998 Ken Pizzini *** Version 3.01-beta17 released * djgpp/config.sed: tweak/simplify s,,, commands at end. * configure.in: update to beta17. 1998-07-14 Eli Zaretskii * djgpp/config.sed: Edit all the occurences of = in the context of --option=value, including in the help messages, into --option:value, but leave DOS-style d:/foo/bar file names intact. * djgpp/config.bat: Use --srcdir:foo instead of --srcdir=foo. * testsuite/Makefile.am (help, version): Remove temporary files explicitly, don't use shell wildcards, so it works under DOS 8+3 limits. Thu Jul 9 13:06:00 PDT 1998 16:51:43 PDT 1998 Ken Pizzini *** Version 3.01-beta16 released * djgpp/config.sed: tweak the configure script to use : instead of = for --with-foo=bar option parsing, to work around problems with how command.com handles =s. Wed Jul 8 16:51:43 PDT 1998 Ken Pizzini * djgpp/config.bat: correct inappropriate behavior that I introduced in the beta13 changes (if first argument is a directory, it needs to be handled as the --srcdir). * testsuite/version.gin, testsuite/version.good, testsuite/Makefile.am: Add target to automake to automatically update version.good from (new file) version.gin, instead of hand-editing the version number each release. * testsuite/Makefile.am: miscellaneous gratuitious tweakage -- mainly adding $(RM) commands just because I didn't like leaving the tmp* files from successful runs laying about. Also some editorial comments. * configure.in: update to beta16. Added and commented out experiment with AC_OUTPUT() for testsuite/version.good. Added code to properly handle bare (without =xxx) "--with-regex" option. Sun Jul 5 21:02:16 PDT 1998 Ken Pizzini *** Version 3.01-beta15 released * sed/utils.c(ck_fflush), sed/utils.h, sed/execute.c(output_line): add and use new ck_fflush() function. Sun Jul 5 15:23:47 PDT 1998 Ken Pizzini * sed/compile.c(bad_prog): add more detail to error messages about -e strings. Sun Jul 5 14:29:45 PDT 1998 Ken Pizzini * sed/compile.c(mark_subst_opts), sed/execute.c(do_subst): Define better semantics for interaction of the `g' flag with a numeric flag to the s/// command. It used to be that the `g' command siezed control; now the first (number-1) matches are skipped and then `g' gets control after that. (It is not clear whether this is a feature sneaking in during late beta, or a bug fix; the changes involved were trivial, so I decided to treat it as a bug fix.) * configure.in, testsuite/version.good: update to beta15. Sat Jul 4 09:54:45 PDT 1998 Ken Pizzini *** Version 3.01-beta14 released * sed/basicdefs.h, sed/compile.c, sed/execute.c: per report by "Kaveh R. Ghazi" , copied the ISXXX macros from lib/regex.c so that silly machines which require isascii() to be true before the other isXXX() macros are valid will still work. * configure.in, testsuite/version.good: update to beta14. Thu Jul 2 23:46:13 PDT 1998 Ken Pizzini *** Version 3.01-beta13 released * configure.in, acconfig.h: set USE_REGEX_GNU_H symbol if we are going to be using lib/regex.c. * lib/Makefile.am, lib/regex.h, lib/regex-gnu.h, lib/regex.c: rename lib/regex.h to lib/regex-gnu.h, so that those who choose to use a different regex implementation will not pick-up lib/regex.h when doing "#include ". * sed/regex-sed.h, sed/Makefile.am, sed/compile.c, sed/execute.c, sed/sed.c: create sed/regex-sed.h which acts as a switch to choose either lib/regex.h or the user-supplied , depending on the value passed to configure's --with-regex= option. Thu Jul 2 17:22:31 PDT 1998 Ken Pizzini * configure.in: if an alternative --with-regex= is given, do an AC_CHECK_FUNCS(regnexec regexec) to ensure that at least one of these functions is available. Also, parallel changes for the default case. * sed/execute.c, acconfig.h: retire use of the WITH_REGNEXEC test macro in favor of HAVE_REGNEXEC test macro created by above change. * djgpp/config.bat: Play games to handle "install-sh", DOS filename restrictions, GNU makefile default rules, and getting a correct run of "configure" (contributed by Eli Zaretskii ). * djgpp/Makefile.am, testsuite/Makefile.am, testsuite/Makefile.in, Makefile.am, configure.in: Various automake targets (such as distcheck) failed with old configuration. The simplest solution was to just add these .am files. (The testsuite/Makefile.in was just renamed to testsuite/Makefile.am, then various redundant defines and targets were deleted.) (Reported by Erick Branderhorst .) * testsuite/dc.good, testsuite/dc.inp: per suggestion from Greg Ubben , use base 16 output to exercise even more of the dc.sed script. * configure.in, testsuite/version.good: update to beta13. Sun Jun 28 16:21:02 PDT 1998 Ken Pizzini *** Version 3.01-beta12 released * doc/sed.texi: Avoid mixing @code and @samp markups together: they look ugly in Info. Use @url and @email instead of @example. Add indexes. (Basis of changes contributed by Eli Zaretskii.) * djgpp/*, Makefile.am: add support for the DJGPP compiler, contributed by Eli Zaretskii . * dc.sed, testsuite/Makefile.in, testsuite/dc.inp, testsuite/dc.good: added this remarkable script, written and contributed by Greg Ubben , both as a work of art for general admiration, and also for use in regression testing. * configure.in, lib/Makefile.am: add --with-regex=regexlib option, which overrides the use of lib/regex.c. * configure.in, testsuite/version.good: update to beta12. Fri Jun 12 16:41:48 PDT 1998 Ken Pizzini *** Version 3.01-beta11 released * sed/compile.c: add module-static variables first_script (for #n change below) and pending_text (for a/c/i change below). * sed/compile.c(compile_file), sed/compile.c(compile_program): Instead of having #n trigger the -n option in *any file*, have #n trigger the -n option only if they are the first two bytes of the first script or script-file. * sed/compile.c(compile_string), sed/compile.c(compile_file): clear the first_script variable at end of these functions. * sed/sed.h: tease out the struct text_buf declaration from struct sed_cmd, so that a pointer to such can be passed to new sed/compile.c(read_text) function. * sed/compile.c(compile_program), sed/compile.c(read_text): Tease out handling of text to a/c/i commands to new read_text() function. Handle (via aid of pending_text variable) texts which span more than one script/script-file option. In particular, restore the ability to have this work: sed -e '1i\' -e 'foo' * sed/compile.c(check_final_program): close off any dangling pending_text allocation. Thu Jun 11 11:17:46 PDT 1998 Ken Pizzini * sed/execute.c(do_subst): fixed two bugs: s/ */X/g was failing to match the final empty string after the end of the pattern space; and /^foo$/s/o/x/3p was printing, despite the failure to do a substition. Fri Jun 5 04:40:24 PDT 1998 Ken Pizzini * configure.in: change the AC_ARG_WITH(regnexec, ...) to be the more appropriate AC_ARG_ENABLE(regnexec, ...). * configure.in, testsuite/version.good: update to beta11. Fri Jun 5 00:54:25 PDT 1998 Ken Pizzini *** Version 3.01-beta10 released * sed/execute.c: forgot to P_() the prototype and old-style the declaration for bootstrap_memchr()! Thu Jun 4 18:42:30 PDT 1998 Ken Pizzini * sed/compile.c(snarf_char_class): added code to recognize \n or \ sequence within a char-class as the newline character. Tue Jun 2 11:56:02 PDT 1998 Ken Pizzini * configure.in: added check for and a AC_ARG_WITH(regnexec,...) check, to simplify use of other regex libraries which have regexec() but not regnexec(), with the corresponding loss of functionality (regexps will not work right against input lines which contain NULs). * sed/execute.c: add nul_append() function, a #define for a regnexec() -> regexec() macro (conditional on the lack of the WITH_REGNEXEC symbol), and a couple of calls to nul_append() (in match_an_address_p() and do_subst()) to permit the use of the POSIX standard regexec() function call instead of the suggested regnexec() call. * sed/compile.c, sed/execute.c, sed/sed.c: check for and include it (before "regex.h") if available. This makes it simpler to use the system's regex library instead of the one in lib/regex.c, should that be desired. Tue Jun 2 08:41:05 PDT 1998 Ken Pizzini * sed/basicdefs.h: define VCAST macros to allow sed to compile on systems which predate the definition of "void *", and yet still get feedback about stupid programming errors from systems which *do* know about "void *"s. Also define MALLOC, REALLOC, MEMDUP, and FREE macros to keep under control the degree of code ugliness which would otherwise be introduced in making use of the VCAST macro. * sed/compile.c, sed/execute.c, sed/sed.c, sed/utils.c: pervasively use the new VCAST, MALLOC, REALLOC, MEMDUP, and FREE macros wherever appropriate. * sed/utils.c, sed/utils.h: correct type of first arguments to ck_fread() and ck_fwrite() to be [const] VOID *. * sed/basicdefs.h, sed/execute.c: protect against the rumored systems which stupidly #define __STDC__ 0. * testsuite/help.good, testsuite/Makefile.in: make the ``help'' test insensitive to the spelling of the executable's name. Also, enhanced `make clean' target. * doc/sed.texi, doc/sed.1: correct documentation of `q' command; fix typos. * configure, testsuite/version.good: update to beta10. Sat May 30 17:28:00 PDT 1998 Ken Pizzini *** Version 3.01-beta9 released * Makefile.am: make testsuite a normal SUBDIR. * configure.in: discontinue using AC_ISC_POSIX -- check for -lcposix library instead; added testsuite/Makefile to AC_OUTPUT list. * lib/memmove.c(memmove): fixed wrong sense used for HAVE_BCOPY test. * sed/execute.c: checked more specifically for a version of gcc which supports __attribute__ (i.e., >= 2.7). * testsuite/*: renamed files to fit 14 char limit. * testsuite/Makefile, testsuite/Makefile.in: Makefile renamed to Makefile.in and then modified so that "make -j check" from top directory will work. * testsuite/subwrite.sed, testsuite/writeout.sed: changed file name of the "w" command to be consistent with the new naming used in testsuite/Makefile.in. * doc/sed.1, doc/sed.texi: fixed some typos, formatting glitches, and poor wordings. Sat May 30 04:02:29 PDT 1998 Ken Pizzini * configure.in: specify that config.h is to be derived from config_h.in in order to avoid the braindead DOS filesystem limitations. Fri May 29 21:56:30 PDT 1998 Ken Pizzini * sed/compile.c(compile_address), doc/sed.texi: gave a better definition to the meaning of N~0 address forms -- N~M addresses now mean that lines match when there exists a non-negative x such that lineno == N+x*M. Fri May 29 12:07:38 PDT 1998 Ken Pizzini * sed/compile.c(compile_address), sed/execute.c(match_an_address_p): update semantics of N~M address form: now N is the first line which will match and M is the step between succeeding matches. If N=M seems more useful. * doc/sed.1, doc/sed.texi: update documentation of N~M address form; added "Other Resources" node to sed.texi; minor formatting changes to some items in sed.1 with an eye to improving clarity. * configure.in, testsuite/version.good: update to beta9. Sat May 23 20:04:31 HST 1998 Ken Pizzini *** Version 3.01-beta8 released * sed/compile.c(compile_regex): forgot to make last_re be a *copy* of the buffered text in today's earlier fix. * sed/execute.c(read_file_line): EOF check was wrong -- it forgot to allow for the possibility that we were appending to the end of the ``line'' (instead of merely reading a fresh line). Sat May 23 18:07:18 HST 1998 Ken Pizzini * sed/compile.c(compile_regex): don't track compiled version of regex -- the modifiers may change. Track the regex source instead. (For "last regex" (aka //) notation.) * configure.in, testsuite/version.good: update to beta8. Sat May 23 16:07:09 HST 1998 Ken Pizzini *** Version 3.01-beta7 released * sed/execute.c: #undef'd EXPERIMENTAL_DASH_N_OPTIMIZATION because its code is buggy. Tue May 19 17:03:52 HST 1998 Ken Pizzini * sed/sed.c: label rx library code as such with #ifdefs (instead of just #if 0). * sed/compile.c(compile_program): make incremental improvement to the "Unknown command" error message. Sat May 16 23:16:26 HST 1998 Ken Pizzini * testsuite/Makefile: simplify: get rid of automatic run against system's sed; don't time by default; allow for alternative comparison command. * configure.in, testsuite/version.good: update to beta7. Wed May 13 21:44:28 PDT 1998 Ken Pizzini *** Version 3.01-beta6 released * lib/Makefile.am: fix spelling of libsed_a_LIBADD in libsed_a_DEPENDENCIES. * configure.in, testsuite/version.good: update to beta6. Wed May 13 14:38:08 PDT 1998 Ken Pizzini *** Version 3.01-beta5 released * sed/execute.c(do_subst): added not_bol_p variable to track when we have iterated past the beginning of the pattern. [Thanks to Jim Meyering for the bug report.] Wed May 13 13:54:04 PDT 1998 Ken Pizzini * sed/execute.c(bootstrap_memchr): new function. When bootstrapping we don't know if we are on a 64-bit machine, so lib/memchr.c breaks. Supply this (slow) implementation just to get us bootstrapped. * bootstrap.sh: add a #define BOOTSTRAP symbol; add -I. for emphasis for the compiles in sed/; be explicit about what files we're bothering to compile. * configure.in, testsuite/version.good: update version to beta5. Wed May 13 06:39:06 PDT 1998 Ken Pizzini *** Version 3.01-beta4 released * rename writeout.good? to wrtout?.good and subwrite.good? to subwrt?.good to comply with DOS 8+3 file name restrictions. [Eli Zaretskii suggested this to simplify DJGPP ports, and it was easy.] * testsuite/Makefile: reflect above name changes. Wed May 12 21:09:32 PDT 1998 Ken Pizzini * sed/sed.c(usage): fix non-portable omission of \n\ at end of lines within long string. * sed/sed.c(main): remove spurious argument to fprintf() in the 'V'ersion output. * sed/execute.c(line_append): embed newline between the two text fragments unconditionally. * sed/execute.c(do_subst): change structure assignment to memcpy() (for portability reasons). * README.bootstrap: suggest using -w option. Tue May 12 10:02:37 PDT 1998 Ken Pizzini * configure.in: use AC_REPLACE_FUNCS where appropriate. * lib/Makefile.am: updated to reflect AC_REPLACE_FUNCS change in configure.in. * lib/memchr.c lib/memcmp.c: revert to standard GNU versions. * lib/alloca.c: added this missing file. * testsuite/version.good: updated for new version identifier. Mon May 11 18:50:56 PDT 1998 Ken Pizzini *** Version 3.01-beta3 released * sed/Makefile.am: fix INCLUDES to work right with VPATH. [Thanks to Jim Meyering for the bug report.] * sed/sed.c(usage): make --help output more user-friendly? * sed/execute.c(execute_program): fix bug in 'x' command introduced in the alleged portability fix of May 9. * configure.in: update version to 3.01-beta3. * testsuite/version.good, testsuite/help.good: freshen with latest output. Sat May 9 22:35:45 PDT 1998 Ken Pizzini *** Version 3.01-beta2 released * sed/sed.c: add #include in HAVE_MMAP block (needed on some machines). * lib/memmove.c: #include , if HAVE_MEMORY_H. Sat May 9 21:29:00 PDT 1998 Ken Pizzini * configure.in: remove dangling references to rx library; added HEADER and FUNC checks for items used by source in lib/. * lib/ansidecl.h, lib/memcopy.h, lib/pagecopy.h, lib/string.h lib/memcpy.c, lib/memmove.c: deletes these files. There are still pieces of glibc missing to support these, and it isn't worth the headache right now. * lib/memmove.c: de novo, simpler version. Uses bcopy() if available, and slow-but-simple code if not. * lib/Makefile.am: remove references to deleted files. Added forgotten reference to memcpy.c. Re-ordered SOURCE entries to reflect dependencies for systems which lack ranlib. * sed/basicdefs.h: updated to reflect above changes to lib/, and experience with non-STDC compilers. * lib/regex.c: made regerror() function publicly visible. * lib/strerror.c: use old-style function declaration. * sed/compile.c, sed/execute.c, sed/sed.c, sed/utils.c, sed/sed.h, sed/utils.h: ensure that private definitions of some symbols do not cause problems when #include'ing system headers (mainly by re-ordering the #include directives). (This is particularly an issue for bootstrap.sh runs.) * sed/execute.c (execute_program): use memcpy() instead of structure assingment ('x' command), for portablility to old compilers. * sed/execute.c (slow_getline): use old-style function declaration, with a P_ prototype. * sed/sed.c: change the type of the fallback MAP_FAILED definition to work on archaic systems. (Modern systems should be defining it themselves, so the change from void * shouldn't be a problem.) * bootstrap.sh, README.bootstrap: actual testing of bootstrap code revealed that I was too optimistic. Redesigned and replaced implementation. * testsuite/Makefile: ignore errors from reference-implementation seds that aren't up to snuff. * testsuite/help.good, testsuite/version.good: update to current version's output. Fri May 8 15:08:28 PDT 1998 Ken Pizzini *** Version 3.01-beta1 released * sed/sed.c (main, usage): once again tweak the --help and --version output to bettery comply with GNU coding standards. * testsuite/help.good, testsuite/version.good: update to reflect above change. * doc/sed.texi: fix "Invoking" node's spelling to comply with GNU standards. Fri May 8 11:43:10 PDT 1998 Ken Pizzini * doc/sed.1, doc/Makefile.am: wrote (very basic) man page. Thu May 7 20:40:21 PDT 1998 Ken Pizzini * lib/Makefile.am, lib/memmove.c, lib/memchr.c, lib/regex.c, lib/memcpy.c, lib/regex.h, lib/memcopy.h, lib/string.h, lib/pagecopy.h, lib/ansidecl.h: grab yet-another-version from gnu.org for baseline and/or edit copyright boilerplate using official lgpl2gpl.sed script. Take care not to loose regnexec() interface or special conditional-compilation code. Wed May 6 23:35:12 PDT 1998 Ken Pizzini * lib/regex.c, lib/regex.h: take from grep-2.1 distribution, then trivially added the regnexec() interface. * sed/sed.c, sed/compile.c, sed/execute.c: made modifications to work with regex instead of rx. * rx/*: deleted directory; the code is just too slow. I think it will be easier to extend regex to fully support POSIX.2 than to tune rx to be reasonable. Even if this supposition is wrong, I'd rather make the 3.01 release with the slightly deficient regex. * Makefile.am lib/Makefile.am, sed/Makefile.am: made changes related to the substitution of regex for rx. * lib/Makefile.am, sed/Makefile.am: since regex is not a ``compatability'' module, changed name of library to ``libsed.a''. * lib/memchr.c, lib/memcpy.c, lib/memmove.c: add conditional compilation code to leave zero-sized .o file if system already supports the implemented function. * testsuite/help.good, testsuite/version.good: brought up-to-date (once again). * NEWS, ANNOUNCE: changes to reflect this batch of changes. Wed May 6 18:40:47 PDT 1998 Ken Pizzini * sed/execute.c: discovered awful bug in '}' handling: it could read past the end of vec (because `n' was being decremented below zero)! Needed to "continue" instead of "break". Tue May 5 14:34:38 PDT 1998 Ken Pizzini * doc/sed.texi, doc/version.texi: wrote some rudimentary texinfo documentation. * ANNOUNCE, NEWS, README, README.rx, Makefile.am: more updates for the upcoming beta-release. * sed/compile.c, sed/execute.c, sed/sed.c, sed/utils.c, sed/sed.h, lib/strerror.c: update copyright notice text. Fri May 1 15:41:37 PDT 1998 Ken Pizzini * sed/execute.c (match_an_address_p, match_address_p): if the second element of an address range is a line number, and that line number is *less than* (or equal to) the current line number, we only match the one line (per POSIX.2, section 4.55.7.1). [Bug discovered as reported in the seders mailing list FAQ.] * AUTHORS, NEWS, acconfig.h, configure.in, doc/Makefile.am, lib/Makefile.am, sed/Makefile.am, lib/README, testsuite/help.good, testsuite/version.good: Updated in anticipation of the 3.01-beta1 release. Reorganized development source tree to make creation of a distribution simpler. Most notable changes were to the various Makefile.am files and configure.in, but some minor edits (such as deleting or changing #include directives) have been made in many other source files. * bootstrap.sh, README.bootstrap: created a mechanism for creating sed on a system which lacks a working sed. Thu Apr 16 23:52:11 PDT 1998 Ken Pizzini * sed.h, sed.c, execute.c, compile.c: did a spell-check on the comments; fixed several typos. Thu Apr 16 13:43:01 PDT 1998 Ken Pizzini * execute.c (do_subst): fixed bug where the "replaced" flag was being set to one inappropriately when at least one but fewer than sub->numb matches of the regexp were found. (Thanks to Simon Taylor for the bug report.) Wed Apr 15 11:35:31 PDT 1998 Ken Pizzini * sed.h, sed.c, compile.c, execute.c: having a concern that a cast was being done inappropriately, and realizing that there is no quick way to locate all casts in a program, I went through and marked all casts with a simple macro. Now it is a simple matter to locate the casts, and it is also a simple matter to turn of casts for a lint session (if it should be desired). Wed Apr 15 10:29:21 PDT 1998 Ken Pizzini * compile.c, sed.c: redo compile phase so that brace expressions can be spread across multiple files. For example: printf '{' >a; printf 'l;d' >b; printf '}' >c sed -f a -f b -f c foo will now compile (and work), instead of complaining about an unmatched '{'. The mess created in compile.c allowed a little simplification to the command-line processing of "-e" options in sed.c. sed.h: added (opaque) err_info member to struct vector; added comments to the members of struct vector. Wed Apr 14 23:50:50 PDT 1998 Ken Pizzini * sed.h, sed.c, compile.c, execute.c: added types countT and flagT in order to clarify what various "int"s were doing. Also makes it easy to change the type used for counts (for example, to "unsigned long long") if desired, although there are still some gotchas (such as the printf() format for the '=' command). Tue Apr 14 17:34:54 PDT 1998 Ken Pizzini * execute.c (execute_program, process_files, count_branches, shrink_program): Added a first attempt at program optimization. We now can quit early if we are running with the "-n" and all of the commands are known to be valid only for lines less than the current line. Thus the "sed" in "foo | sed -n 1,2p" will print read three lines, printint the first two, and then quit, regardless of how much longer "foo" might run or output. This optimization does not buy much in most cases (it sometimes even costs a little), but when it does help it can help big. The code is all conditionally compiled based on the EXPERIMENTAL_DASH_N_OPTIMIZATION symbol being #defined, so it can be easily omitted if it causes problems. Tue Apr 14 12:25:06 PDT 1998 Ken Pizzini * execute.c (test_dollar_EOF, last_file_with_data_p): test_dollar_EOF() was incorrectly returning a false (0) when there were unprocessed files, none of which had any data (either unopenable or zero-length). Created last_file_with_data_p() to detect this situation, and modified test_dollar_EOF() to make use of it. Thu Apr 2 23:02:18 PST 1998 Ken Pizzini * compile.c (match_slash): match_slash() did not handle [.coll.], [=equiv=], and [:class:] sequences within a character class. Added snarf_char_class() [which is a remote derivative of parse_char_class() from GNU ed-0.2] to deal with the details, and altered match_slash() to make use of it. Also created the trivial add_then_next() to avoid clutter in snarf_char_class(). Thu Apr 2 20:34:42 PST 1998 Ken Pizzini * execute.c, sed.c, sed.h: There was a severe bug in how the code handled "sed 5n a b" when "a" consists of exactly five lines -- it behaved like "sed 5q a b"! Rearranged where files get opened -- large scale changes primarily involving main(), process_files(), and read_pattern_space(), but also touching on several other parts of execute.c. The read_pattern_space() function became unwieldly and parts were split into open_next_file(), closedown(), read_always_fail(), read_mem_line(), and read_file_line(). The at_end_of_file_p() function became obsolete and was eliminated; test_dollar_EOF_p() was updated. A few global and module-static variables were elminated, and "struct line" was extended; comments were added to the "struct line" declartation to document some important dependencies in it. I undertook the reorganization with dread, but I feel that the new organization is an improvement well beyond just fixing the bug that inspired it. Thu Apr 2 01:16:25 PST 1998 Ken Pizzini * execute.c (read_file_line, slow_getline): the fread() buffering code gives insufficient feedback to a user running sed with a tty input device, so I created slow_getline() for reading from a tty device. Additionally, EOF detection has been made a little more sensitive to avoid requiring multiple EOFs to be entered from a tty. * configure.in: added isatty() check. Wed Apr 1 11:04:30 PST 1998 Ken Pizzini * configure.in (CPPFLAGS, LDFLAGS, LIBS): Set to appropriate values if large file support needs explicit enabling. Code fragment taken from a 1997-10-25 patch to gawk by Paul Eggert Thu Aug 14 17:43:27 PDT 1997 Ken Pizzini * utils.c (ck_fclose): modified to ignore NULL parameter. Thu Aug 14 12:08:45 PDT 1997 Ken Pizzini * execute.c: tweaked execute_program() to eliminate gratuitous "goto" usage. Thu Aug 14 11:30:04 PDT 1997 Ken Pizzini * compile.c: added case-insensitive modifier ('I') to address and s/// regexps. The s/// case also accepts the more popular 'i' modifier. (The address regexp cannot use 'i' as a modifier, as that conflicts with the use of the 'i'nsert command.) Thu Aug 14 09:29:06 PDT 1997 Ken Pizzini * compile.c: abstracted out match_slash() from the s///, y///, and address-regexp special-case codes. * execute.c: made dump_append_queue() use ck_fread() instead of hand-rolled error checking. Mon Jul 28 10:50:41 PDT 1997 Ken Pizzini * sed.c, sed.h, execute.c: POSIX.2, section 4.55.7, says that a newline must end *every* output line. But I think that it is useful (when seding a binary file) to omit a trailing newline if the input lacks one. Thus the addition of POSIXLY_CORRECT behavior. * execute.c: however, when seding multiple files my feeling is that it makes sense to have each file but the last behave as-if it ended in a newline. Modified read_pattern_space() accordingly. * utils.c: realized that add1_buffer(), for performance reasons, shouldn't be calling memcpy() (indirectly via add_buffer()), so rewrote it. Sat Jul 26 23:08:28 PDT 1997 Ken Pizzini * execute.c: attempted to make read_pattern_space more efficient for the the non-mmap() case. * utils.c, utils.h, execute.c: new function ck_fread() created and used. Sat Jul 26 20:22:14 PDT 1997 Ken Pizzini * execute.c, compile.c, sed.c: abstracted the mmap() interface into map_file()/unmap_file() [sed.c], and changed the ad-hoc code in compile_file() [compile.c] and process_file() [execute.c] to make use of the new interface. Sat Jul 26 19:45:46 PDT 1997 Ken Pizzini * execute.c, compile.c, configure.in: Check to see if mmap() is available; if so make use of it on regular files. * compile.c: compile_file() now closes the input file when it is through! Sun Jul 20 23:57:02 PDT 1997 Ken Pizzini * compile.c: modified parsing to permit whitespace in more places where it makes sense; added backslash escaping to the y/// command, per POSIX. * execute.c: Merged append_pattern_space() into read_pattern_space(); moved body of 's' command to new function do_subst(); moved body of 'l' command to new function do_list(); changed output of 'l' command to conform to POSIX.2; made line handling conform to POSIX; added output_line() function; redesigned append-space algorithm; added append_queue structure and the next_append_slot() and dump_append_queue() functions. * sed.h: moved the definition of what is now struct subst outside of the definition of struct sed_cmd. Sat Jul 19 16:29:09 PDT 1997 Ken Pizzini * sed.c, execute.c, sed.h, Makefile.am: Separated out the pieces dealing with executing the program from the top-level parameter parsing and control. Sat Jul 19 01:16:35 PDT 1997 Ken Pizzini * sed.c, compile.c, sed.h, Makefile.am: separate out the pieces dealing with compiling the program from the pieces dealing with interpreting the result. * compile.c: add functions in_nonblank() and in_integer(), and change interface to compile_address() with an eye to making code clearer. Fri Jul 18 13:35:50 PDT 1997 Ken Pizzini * utils.c: attempt at a quasi-unification of the STDC and traditional C approaches to panic(). * sed.c: eliminate some gratuitous bit twiddling. (Using flag bits can be a useful technique, but this code is cleaner without them.) * sed.c: place mutually exclusive members of struct addr within a union, mainly to document the exclusivity; eliminate unused structure members from struct fp_list; eliminate unnecessary module-global variables; remove some #if 0 code that is too odd to keep; allegedly simplified the 'l' case of execute_program(); allegedly simplified inchar(); localized some static variables; renamed some variables to better document their purpose; removed some goto-s rendered obsolete by other changes. Thu Jul 17 15:30:44 PDT 1997 Ken Pizzini * utils.c, utils.h, sed.c: added and made use of ck_free() function. * utils.c, utils.h, sed.c: changed all the *_buffer() functions to take/return an incomplete type "struct buffer *" instead of using VOID *. * utils.c, utils.h, sed.c: renamed "finish_buffer()" to "free_buffer()", on the premise that the new name better describes the function's purpose. Wed Jul 16 13:52:14 PDT 1997 Ken Pizzini * utils.c, utils.h, sed.c: added and made use of ck_memdup() function. * sed.c: protected a call to add1_buffer() in compile_program() which could have tried to push an EOF if a a/i/c command ended with a '\', EOF sequence. * utils.c: added sanity check to add1_buffer() so that EOF will not be added to the buffer. Wed Jul 16 03:56:26 PDT 1997 Ken Pizzini * configure.in, compat.h, compat.c: added memchr. * sed.c: got rid of arbitrary NUM_FPS limit; made global functions and variables "static" where appropriate; make various cosmetic changes, hopefully improving readability; simplified some redundant predicates; simplified some code, but nothing fundamental (yet?). Wed Jul 16 00:24:54 PDT 1997 Ken Pizzini * alloca.c, getopt.c, getopt.h, getopt1.c: updated from versions in textutils-1.22. * Makefile.in, Makefile.am, configure.in: put in automake support. * basicdefs.h, compat.h, compat.c [, sed.c, utils.c]: took out some very ugly compatibility #ifdefs and packaged into one place. * sed.c, utils.c: some gratuitous formatting changes. * utils.c: changed datatype of utils_id_s in order to eliminate arbitrary array size. Sun Jul 13 17:00:26 PDT 1997 Ken Pizzini * sed.c, utils.c, utils.h: de-linting oriented cleanup. Sun Jul 13 00:46:48 PDT 1997 Ken Pizzini * sed.c: fixed bug which caused SEGV for files missing a final newline. Corrected calls to regnexec to pass the proper parameters, in the proper order. Sat Dec 30 20:16:59 1995 Tom Lord *** Version 3.00 released * sed.c: Use posix entry points to regexp functions. Fix enough bugs to pass the test-suite. ....... Jason Molenda * testsuite/: trippy test suite. Wed May 11 07:46:24 1994 Chip Salzenberg (chip@fin.uucp) *** Version 2.05 released * sed.c (compile_address): Recognize numeric addresses. Fixes typo made during installation of "~" feature. Sat Apr 30 17:17:38 1994 Tom Lord (lord@x1.cygnus.com) *** Version 2.04 released * sed.c: applied a patch from From: kap1@tao.cpe.uchicago.edu (Dietrich Kappe) Dietrich writes: As my contribution to the creeping feature creature in sed, here is a new type of address. The address has form n~m, which means "the line number is equal to n modulo m." The modifications to sed are trivial, and the general usefulness of this address should be obvious. If m is 0 or missing, 1 is used in its place (could be a bug or a feature :-). Sat Apr 30 17:17:38 1994 Tom Lord (lord@x1.cygnus.com) * rx.c (solve_destination): protect `solution' more carefully. This is a cleanup of a patch from Kevin Buettner (kev@cujo.geg.mot.com). Sat Apr 30 17:17:38 1994 Tom Lord (lord@x1.cygnus.com) * rx.c: make translation tables unsigned chars * sed.c (main): Compile accumulated -e commands as soon as a -f command comes along. This ensures that the commands are executed in the right order. Mon Oct 25 14:41:47 1993 Tom Lord (lord@rtl.cygnus.com) * sed.c (execute_program): 'w' flushes the buffer after it writes -- diagnosed by doug@research.att.com. 'r' and 'w' to the same file is now supported -- hopefully even in a way that satisfies Posix (it now behaves differently from some /bin/sed's and the spec is hard to read so i'm not sure). Also, 'r' of a non-existent file is now permitted. Mon Oct 11 21:06:10 1993 Tom Lord (lord@cygnus.com) * sed.c (execute_program): remember that 'b' and 't' are more like longjmp than goto. Patch from tom@basil.icce.rug.nl (Tom R.Hageman) * rx.c: patch from From: fin!chip@rutgers.edu (Chip Salzenberg) to get rid of compiler warnings. Sat Aug 7 01:04:59 1993 Tom Lord (lord@unix7.andrew.cmu.edu) *** Version 2.03 released * sed.c (compile_regex): report error messages for bogus regexps. SEE ALSO: ChangeLog.rx Wed Jul 21 00:28:03 1993 Tom Lord (lord@unix8.andrew.cmu.edu) * alloca.c: upgraded to a more recent version * rx.c (re_search_2): prefer matches with longer subexpressions to those with shorter ones, giving precedence to low numbered subexpressions. * rx.c (re_compile): don't free `params' if its null. Fri Jul 16 01:12:08 1993 Tom Lord (lord@unix8.andrew.cmu.edu) * rx.[ch], sed.c: rx replaces regex. Thu May 27 11:13:03 1993 Tom Lord (lord@unix3.andrew.cmu.edu) * sed.c (execute_program, match_addr): caught more cases that need to be sensitive to a missing \n at EOF. Fri May 21 00:39:22 1993 Tom Lord (lord@unix8.andrew.cmu.edu) * sed.c (execute_program): apply gaumondp's patch to fix '\xabcxs/foo/bar/'. * sed.c (execute_program): If a second address is a regexp, never match it on the same line as the first address. * sed.c (compile_regexp): Numeric ranges x,y s.t. y < x are now treated as x,x. There was a bug in that they were being handled like x,x+1. * sed.c (execute_program, read_pattern_space, append_pattern_space) don't add newlines to lines that don't have them. Wed May 19 13:34:45 1993 Tom Lord (lord@unix9.andrew.cmu.edu) * sed.c (compile_program): grok \\n in comments. Mon May 17 16:34:50 1993 Tom Lord (lord@unix9.andrew.cmu.edu) * alloca.c: new (standard) file * configure.in: AC_CONSTified * sed.c (compile_program): properly diagnose the error of a missing command (e.g. sed /x/). (thanks gaumondp) * sed.c (compile_regexp): handle character classes correctly. Thanks gaumondp@ERE.UMontreal.CA and schwab@issan.informatik.uni-dortmund.de. Thu May 6 12:37:18 1993 Tom Lord (lord@unix10.andrew.cmu.edu) * sed.c (compile_filename, execute_program): don't use `access' or `/dev/null'. * sed.c (execute_program): 'N' at EOF should delete the pat buf. * sed.c (compile_filename): truncate, don't append files being openned for `w' or `s///w' * sed.c (execute_program): -n switch shouldn't effect `i' or `c'. * sed.c (compile_program): don't compile unescaped newlines into the substitution string of an `s' command (they are an error). * sed.c (compile_regex): correctly skip over character sets that contain `]'. * sed.c (execute_program): patch from gaumondp Correctly handle empty-string matches in the case of an `s' command with a repeat count. * sed.c (compile_program): patch from gaumondp@ere.UMontreal.ca. Don't consume characters after the label of a `b', `t' or `:' command. * sed.c (compile_program): unmatched open braces are an error. * sed.c (compile_file): when consuming an initial comment, count lines correctly. Wed Nov 18 02:10:58 1992 Tom Lord (lord@unix2.andrew.cmu.edu) * sed.c (execute_program): Made s///p print even if -n was specified. * sed.c (compile_string): Changed the type of this function to fix a compile warning. Wed Nov 4 17:15:34 1992 Tom Lord (lord@unix7.andrew.cmu.edu) * sed.c (main): Initialize the hold area to contain "\n" instead of "". In execute_program, all lines are expected to be newline terminated. Also, if H is the first command in the script, the result is a pattern buffer that begins with a blank line. Thanks to pinard@iro.umontreal.ca (Francois Pinard) for pointing out this and many other bugs. * sed.c (execute_program): Fixed a case of `D' command. Thanks Chris Weber * sed.c: added new tests of no_default_output to make -n work. Thanks Andrew Herbert * sed.c, configure.in,Makefile.in: autoconfed bcopy and const. Thanks "J.T. Conklin" * sed.c: made prog_cur, prog_start, and prog_end unsigned so that users could write `sed -e s/ÿ/foo/g'. Tue Oct 13 00:04:05 1992 Tom Lord (lord@unix3.andrew.cmu.edu) * sed.c (execute_program): fixed the cycling behavior of 'D' * sed.c: integrated patch that closes files * sed.c: changed regexp syntax Fri May 22 15:11:12 1992 Tom Lord (lord at moriarty.bh.andrew.cmu.edu) * regex.c: this is not my change, but a pointer to the fact that karl@gnu fixed some regexp bugs that were plaguing sed. Thu Apr 30 13:02:21 1992 Tom Lord (lord at unix3.andrew.cmu.edu) * sed.c (compile_program, execute_program) subprograms are now compiled with an explicit continuation ;) return_v and return_i in struct vector. execute_program no longer recurses to execute subprograms (case '{') and now understands a return instruction (case '{'). Tue Apr 28 17:13:04 1992 Tom Lord (lord at unix7.andrew.cmu.edu) * sed.c (compile_address) added \?regexp? syntax for addresses. * sed.c (main) added {} intervals to the obscure regexp syntax. * sed.c (compile_program) after calling compile_address, normalize numeric addresses (make a2.addr_number > a1.addr_number). This is necessary because line numbers must match exactly, but sed does not try to match a2 until after a1 has matched, yet a1,a2 where a2 <= a1 is defined to be equivelent to a1,a1+1 Sat Feb 29 10:55:54 1992 David J. MacKenzie (djm@nutrimat) * sed.c (usage): Document long options as starting with `--'. Mon Dec 9 23:56:40 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu) * sed.c: Include sys/types.h, for new regex.h. Tue Nov 5 02:16:01 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu) * utils.c: Change NO_VFPRINTF to VPRINTF_MISSING, for compatibility with autoconf. Mon Sep 2 22:02:40 1991 David J. MacKenzie (djm at apple-gunkies) * sed.c (compile_regex): Treat \ as a normal character when in a char class. Thu Aug 8 00:15:33 1991 David J. MacKenzie (djm at bleen) * Version 1.08. * sed.c (compile_filename): If reading a file fails, read /dev/null instead. It's what Unix and POSIX do, effectively. * sed.c (compile_regex): The 'slash' character doesn't terminate the regex if it's in a character class. * sed.c (main): If given no args, or bad option, print usage message. (usage): New function. * sed.c (execute_program): Amount written for 'P' command was wrong. From stephend@ksr.com (Stephen Davis). Wed Aug 7 16:51:14 1991 David J. MacKenzie (djm at apple-gunkies) * sed.c (append_pattern_space): Check for buffer full before instead of after writing to buffer. Don't need to test for EOF initially anymore, due to the next change. (execute_program): For 'n' and 'N' commands, if eof is reached in input, quit the script like Unix sed does. Fix memory allocation problems for 'a' and 'r' commands. (compile_program): Fix off by one error in processing comments. All of the above are from Tapani Tarvainen, tarvaine@tukki.jyu.fi. * sed.c (setup_jump): Use isblank instead of testing for ' ' or '\t', for POSIX locales. * utils.c (ck_strdup): Renamed from strdup. * sed.c: Change callers. * sed.c, utils.c: Clean up declarations and includes to get rid of compiler warnings. * sed.c (main): Add long-named options. Don't complain if -n is given twice. Fri Aug 2 12:33:16 1991 David J. MacKenzie (djm at apple-gunkies) * configure: Support +srcdir arg. Create config.status and remove it and Makefile if interrupted while creating them. * Makefile.in: Change DESTDIR to prefix. Mon Jul 15 13:07:39 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu) * sed.c (main): Add -V option to print version number. (USAGE): Mention -V. Mon Jul 8 01:42:22 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu) * sed.c: Define bcopy in terms of memcpy if STDC_HEADERS as well as if USG. (compile_filename): Don't glob filename (for 'r' and 'w' commands). Unix sed doesn't do it and it's not very useful, since it can only match 0 or 1 files. (execute_program): Change '\a' to 007 since some compilers don't recognize \a. * utils.c: New file; code moved from sed.c. * Replace Makefile with Makefile.in and configure. Update README. Tue Mar 26 13:00:48 EST 1991 Jay Fenlason (hack@gnu.ai.mit.edu) * sed.c (match_address) Added a trivial cast for portability. Mon Feb 25 13:23:29 EST 1991 Jay Fenlason (hack@ai.mit.edu) * sed.c Changed 's' command to work with latest version of regex() routines, which mysteriously changed somewhere in there. . . A one-line patch from David Eckelkamp (eckelkamp@mcc.com). Initialize the fastmap in the hopes that it'll make sed faster. Thu Feb 21 13:42:27 EST 1991 Jay Fenlason (hack@ai.mti.edu) * sed.c Change panic to compile with other __STDC__ compilers. Wed Jan 30 10:46:38 EST 1991 Jay Fenlason (hack@ai.mit.edu) * sed.c Changed version number. Made new release. Tue Nov 27 15:34:51 EST 1990 Jay Fenlason (hack@ai.mit.edu) * sed.c (setup_jump) Don't blow chunks if there isn't a label after a b or t command. (main) Don't panic if it a branch command doesn't have a label to branch to. (main) Collect all the -e arguments together and parse them all at once. This way, -e { -e mumble -e } will work. All these small patches from David Schmidt (davids@isc-br.isc-br.com) Tue Sep 11 12:51:37 EDT 1990 Jay Fenlason (hack@ai.mit.edu) * sed.c Changed some function forward declarations to use VOID * instead of char * Mon Jul 16 11:12:54 EDT 1990 Jay Fenlason (hack@ai.mit.edu) * sed.c (ck_malloc) Use malloc(1) instead of malloc(0) if given a request for zero bytes. Tue Jun 5 02:05:37 1990 David J. MacKenzie (djm at albert.ai.mit.edu) * sed.c: Remove excess newlines from calls to panic. Reformat some comments to fit in 79 columns. Base whether to use void * on __STDC__, not __GNU__. (main): Add missing arg when printing usage message. Print usage if given invalid arg. (panic) [__STDC__]: Add missing ", ...". (compile_filename): Print correct error message if glob_filename returns NULL. Thu Apr 5 21:41:12 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu) * sed.c (execute_program, case 'r'): When need to realloc append.text, multiply append.alloc by 2 instead of adding cur_cmd->x.cmd_txt.text_len. Tue Mar 6 15:55:35 EST 1990 Jay Fenlason (hack@ai.mit.edu) * sed.c (compile_regex) Allocate 10 bytes extra space needed by re_compile_pattern. Sun Feb 25 16:32:10 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu) * sed.c (execute_program, case 'l'): Print \00 instead of \0. Print backslash as \\ not \. Print \xx instead of /xx. Thu Feb 1 14:02:28 EST 1990 hack@wookumz * sed.c (memchr) Use () inside inner loop so it will work correctly. A two character patch from Robert A Bruce (rab@allspice.berkeley.edu) Wed Sep 27 18:47:39 EDT 1989 hack@ai.mit.edu * sed.c (compile_regex) New function. When compiling regex, turn ^ into \` and $ into \' so that they won't match on embedded newlines. UN*X pattern matching is a crock. (compile_program, compile_address) call compile_regex. Mon Sep 18 10:15:32 EDT 1989 hack@ai.mit.edu * sed.c (compile_program): define translate as unsigned char * so that y command will work on non-ascii characters. Changed version number to 1.06. Thu Sep 14 15:57:08 EDT 1989 hack@ai.mit.edu * sed.c (compile_program) Let programs use ; to terminate } as well as newline. (read_file) Print an error msg to stderr if it can't open an input file. Thu Mar 23 18:04:46 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu) * Makefile, sed.c: Added new copyright notice. * Makefile: Make distributions which follow the symlinks. hack@ai.mit.edu 1.05 Fixed error in 'r' (now does things in the right order) 1.04 Fixed s/re/rep/[number] 1.03 Fixes from Mike Haertel for regexps that match the empty string, and for Ritchie stdio (non-sticky EOF) 1.02 Fixed 't', 'b', ':' to trim leading spaces and tabs Fixed \\ in replacement of 's' command Added comments 1.01 Added s/re/rep/[digits] added #n as first line of script added filename globbing added 'l' command All in the name of POSIX 1.00 Began (thinking about) distributing this file Local Variables: mode: indented-text left-margin: 8 version-control: never End: sed-3.62/INSTALL0000644000076600007660000002203010143704266010205 00000000000000Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. sed-3.62/Makefile.am0000644000076600007660000000070510176462060011214 00000000000000## Process this file with automake to produce Makefile.in # Automake requirements AUTOMAKE_OPTIONS = gnits 1.8 ACLOCAL_AMFLAGS = -I config DISTCHECK_CONFIGURE_FLAGS = XGETTEXT='$(SHELL) -c : dummy' PACKAGE = sed SUBDIRS = intl lib pcre po sed doc testsuite noinst_DATA = bootstrap.sh noinst_HEADERS = basicdefs.h EXTRA_DIST = BUGS THANKS COPYING.DOC README.boot bootstrap.sh \ config/texi2dvi config/help2man html: cd doc && make html sed-3.62/Makefile.in0000644000076600007660000005041610202173551011223 00000000000000# Makefile.in generated by automake 1.9.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) $(noinst_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/bootstrap.sh.in $(srcdir)/config_h.in \ $(top_srcdir)/configure $(top_srcdir)/intl/Makefile.in \ ABOUT-NLS AUTHORS COPYING COPYING.DOC ChangeLog INSTALL NEWS \ THANKS TODO config/config.guess config/config.rpath \ config/config.sub config/depcomp config/install-sh \ config/mdate-sh config/missing config/texinfo.tex subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/codeset.m4 \ $(top_srcdir)/config/getline.m4 \ $(top_srcdir)/config/gettext-ver.m4 \ $(top_srcdir)/config/gettext.m4 \ $(top_srcdir)/config/glibc21.m4 $(top_srcdir)/config/iconv.m4 \ $(top_srcdir)/config/lcmessage.m4 \ $(top_srcdir)/config/lib-ld.m4 \ $(top_srcdir)/config/lib-link.m4 \ $(top_srcdir)/config/lib-prefix.m4 \ $(top_srcdir)/config/progtest.m4 \ $(top_srcdir)/config/stdbool.m4 \ $(top_srcdir)/config/strverscmp.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = bootstrap.sh intl/Makefile SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive DATA = $(noinst_DATA) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HTML_FALSE = @BUILD_HTML_FALSE@ BUILD_HTML_TRUE = @BUILD_HTML_TRUE@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ HAVE__BOOL = @HAVE__BOOL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKEINFO_HTML_FALSE = @MAKEINFO_HTML_FALSE@ MAKEINFO_HTML_TRUE = @MAKEINFO_HTML_TRUE@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = sed PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCREGREP = @PCREGREP@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED_FEATURE_VERSION = @SED_FEATURE_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TEXI2HTML = @TEXI2HTML@ TEXI2HTML_HTML_FALSE = @TEXI2HTML_HTML_FALSE@ TEXI2HTML_HTML_TRUE = @TEXI2HTML_HTML_TRUE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ # Automake requirements AUTOMAKE_OPTIONS = gnits 1.8 ACLOCAL_AMFLAGS = -I config DISTCHECK_CONFIGURE_FLAGS = XGETTEXT='$(SHELL) -c : dummy' SUBDIRS = intl lib pcre po sed doc testsuite noinst_DATA = bootstrap.sh noinst_HEADERS = basicdefs.h EXTRA_DIST = BUGS THANKS COPYING.DOC README.boot bootstrap.sh \ config/texi2dvi config/help2man all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnits '; \ cd $(srcdir) && $(AUTOMAKE) --gnits \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnits Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config_h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config_h.in: $(am__configure_deps) cd $(top_srcdir) && $(AUTOHEADER) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 bootstrap.sh: $(top_builddir)/config.status $(srcdir)/bootstrap.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ intl/Makefile: $(top_builddir)/config.status $(top_srcdir)/intl/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config_h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config_h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config_h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config_h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @case `sed 15q $(srcdir)/NEWS` in \ *"$(VERSION)"*) : ;; \ *) \ echo "NEWS not updated; not releasing" 1>&2; \ exit 1;; \ esac $(am__remove_distdir) mkdir $(distdir) $(mkdir_p) $(distdir)/. $(distdir)/config $(distdir)/intl $(distdir)/lib $(distdir)/po @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ --with-included-gettext \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) $(HEADERS) config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-recursive ctags \ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \ dist-tarZ dist-zip distcheck distclean distclean-generic \ distclean-hdr distclean-recursive distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-recursive pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-info-am html: cd doc && make html # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: sed-3.62/NEWS0000644000076600007660000004425210202632562007660 00000000000000Sed 3.62 (aligned with GNU sed CVS at 2005-02-10) * added a note to BUGS and the manual about changed interpretation of `s|abc\|def||', and about localization issues. * fixed --disable-nls build problems on Solaris. * fixed `make check' in non-English locales. * implemented [[.a.]] and [[=a=]] where the collating symbol can only include a single character, and that will be the only matched character independent of the locale. * output the result of commands a, r, R when a q command is found. ----------------------------------------------------------------------- Sed 3.61a * sed 3.61 had GNU sed 4.1's toplevel Makefile by mistake. Fixed. ----------------------------------------------------------------------- Sed 3.61 (aligned with GNU sed 4.1) * 0 address behaves correctly in single-file (-i and -s) mode. * // matches the last regular expression even in POSIXLY_CORRECT mode. * added parameter to `v' for the version of sed that is expected. Also, `v' disables POSIXLY_CORRECT behavior. * change the way we treat lines which are not terminated by a newline. Such lines are printed without the terminating newline (as before) but as soon as more text is sent to the same output stream, the missing newline is printed, so that the two lines don't concatenate. The behavior is now independent from POSIXLY_CORRECT because POSIX actually has undefined behavior in this case, and the new implementation arguably gives the ``least expected surprise''. Thanks to Stepan Kasal for discussing the issue and providing the implementation. * documentation improvements, with updated references to the POSIX.2 specification * error messages on I/O errors are better, and -i does not leave temporary files around (e.g. when running ``sed -i'' on a directory). * escapes are accepted in the y command (for example: y/o/\n/ transforms o's into newlines) * fix for -i under Cygwin; also, the -i option tries to set the owner and group to the same as the input file * improvements to some error messages (e.g. y/abc/defg/ incorrectly said `excess characters after command' instead of `y arguments have different lengths') * line number addresses are processed differently -- this is supposedly conformant to POSIX and surely more idiot-proof. Line number addresses are not affected by jumping around them: they are activated and deactivated exactly where the script says, while previously 5,8b 1,5d would actually delete lines 1,2,3,4 and 9 (!). * more translations * multibyte characters are taken in consideration to compute the operands of s and y, provided you set LC_CTYPE correctly. However, the regular expression matcher does not support them yet. * new option --posix, disables all extensions. POSIXLY_CORRECT only disables extensions that violate the POSIX standard. * options -h and -V are not supported anymore, use --help and --version. * Perl's \G escape is supported both in Perl and POSIX regexps (not in GNU sed). * portability fixes * support for [[:blank:]] character class * the -i option tries to set the owner and group to the same as the input file * the `L' command is deprecated and will be removed as soon as GNU sed removes it. * the `N' command's feature that is detailed in the BUGS file is disabled if POSIXLY_CORRECT behavior is requested. * the special address 0 can only be used in 0,/RE/ or 0~STEP addresses; other cases give an error (you are hindering portability for no reason if specifying 0,N and you are giving a dead command if specifying 0 alone). * `a', `i', `l', `L', `r' accept two addresses except in POSIXLY_CORRECT mode. Only `q' and `Q' do not accept two addresses in standard mode. * when a \ is used to escape the character that would terminate an operand of the s or y commands, the character loses any meaning as a metacharacter. This is left undefined by POSIX; this behavior makes `s+x\+++g' remove occurrences of `x+', consistently with `s/x\///g'. ----------------------------------------------------------------------- Sed 3.60 (aligned with GNU sed 4.0) * Maintainance release with no visible changes except more translations were added. Limits differences in source code between GNU sed 4.x and ssed. ----------------------------------------------------------------------- Sed 3.59 * `R' command reads a single line from a file. * CR-LF pairs are always ignored under Windows, even if (under Cygwin) a disk is mounted as binary. * Fixed bug in the numeric parameter to `s'. The replacement flag was set on the first match of the regular expression, not on the Nth. * Fixed bug in /.{1,64}/ * More attention to errors on stdout * New `W' command to write first line of pattern space to a file ----------------------------------------------------------------------- Sed 3.58 * Can customize line wrap width on single `l' commands * `L' command formats and reflows paragraphs like `fmt' does. * Upgraded to autoconf 2.53 * When running a script with in-place editing, command ranges such as /abc/,/def/, line numbers, and the special $ address are reset for each file. The same can be done with the new `-s' option when in- place editing is off. ----------------------------------------------------------------------- Sed 3.57 * Fixed problems with `-i' when /tmp was on a different volume * Fixed problems in \[lLuUE] (due to a construct with undefined behavior which some newer compilers optimized away) ----------------------------------------------------------------------- Sed 3.56 * Added another "heavy-weight" test (like dc.sed) to the testsuite. * Bug fix: after using the D command, the first line could have been considered valid by a subsequent [GH] command. * Prune impossible backtracking paths (e.g. b*c does not backtrack on b). * The test suite makefiles are better organized (this change is transparent however). ----------------------------------------------------------------------- Sed 3.55 * Bug fix: Inside a character class, an unrecognized escape sequence is interpreted as two separate characters: for example [\g] is a character class made of a backslash and a `g'. I thought I had fixed this in 3.49, but that fix was not enough. ----------------------------------------------------------------------- Sed 3.54 * Bug fix: s/^xxxxx//p did not print (related to the optimization introduced by Sed 3.53). This broke Automake 1.5's dependency tracking, so if you installed Sed 3.53 as the system sed you should configure with --disable-dependency-tracking. ----------------------------------------------------------------------- Sed 3.53 * Bug fix: The meanings \` and \' were swapped. * Compiles and bootstraps out-of-the-box under MinGW32 and Cygwin. * Faster on most regular expression because it uses the Boyer-Moore algorithm to process initial fixed-length strings. The "set of possible first characters" algorithm is used as a fallback there is no such string (e.g. when a regex starts with a star or question mark pattern: [0-9]*). * Has a comprehensive test suite for both Posix and PERL regular expressions. * Optimizes cases when pattern space is truncated at its start or at its end by `D' or by a substitution command with an empty RHS. For example scripts like this, seq 1 10000 | tr \\n \ | ./sed ':a; s/^[0-9][0-9]* //; ta' whose behavior was quadratic with previous versions of sed, have now linear behavior. ------------------------------------------------------------------------ Sed 3.52 * Merged with PCRE 3.7: ** pcre_exec() was referring to its "code" argument before testing that argument for NULL (and giving an error if it was NULL). ** The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an absolute limit. Changed the text of the error message to make this clear, and likewise updated the man page. ** The limit of 99 on the number of capturing subpatterns has been removed. * New command `e' to pipe the output of a command into the output of sed. * New option `e' to pass the output of the `s' command through the Bourne shell and get the result into pattern space. * Simple minded optimization in the matcher: if the regexp is anchored to the end of the pattern, and the regexp cannot match more than some number of characters, leap to the end of pattern space minus that number of characters. For example, abc[def]$ will start matching four characters before the end of pattern space. * Switched to obstacks in the parser -- less memory-related bugs (there were none AFAIK but you never know) and less memory usage. ------------------------------------------------------------------------ Sed 3.51 * Bug fix: behavior of undefined regular expressions (such as a single star `*') is more consistent with GNU sed and does not issue internal errors anymore. * Bug fix: fixed internal error when backslashed expressions appeared inside character classes (e.g. [\X]). This broke autoconf 2.50 or later. ------------------------------------------------------------------------ Sed 3.50 * Updated to latest autoconf and automake. * New option -i, to support in-place editing a la Perl. Usually one had to use ed or, for more complex tasks, resort to Perl; this is not necessary anymore. * Dumped buffering code. The performance loss is 10%, but it caused bugs in systems with CRLF termination. The current solution is not definitive, though. * Bug fix: Made the behavior of s/A*/x/g (i.e. `s' command with a possibly empty LHS) more consistent: pattern 3.49 or GNU sed 3.50 B xBx xBx BC xBxCx xBxCx BAC xBxxCx xBxCx BAAC xBxxCx xBxCx Earlier versions matched a spurious empty string after the sequence of A's. ------------------------------------------------------------------------ Sed 3.49 * Bug fix: Inside a character class, an unrecognized escape sequence is interpreted as two separate characters: for example [\g] is a character class made of a backslash and a `g'. This change is needed for compatibility with autoconf 2.50. ------------------------------------------------------------------------ Sed 3.48 * Bug fix: on the RHS of the `s' command, the syntax of the octal constants is the same as for Perl. Note that it is not possible yet to specify more than 9 backreferences on the RHS of the `s' command. * Bug fix: \c is parsed on the RHS of the `s' command. * Bug fix: the q and Q commands could be misinterpreted, leading to spurious syntax errors in the following command * Bug fix: the // empty regular expressions now refers to the last regular expression that was matched, rather than to the last regular expression that was compiled. This richer behavior seems to be the correct one (albeit neither one is POSIXLY_CORRECT). ------------------------------------------------------------------------ Sed 3.47 * This version adds a check for invalid backreferences in the RHS of the `s' command (e.g. s/1234/\1/) and support for \[lLuUE] in the RHS of the `s' command like in Perl. ------------------------------------------------------------------------ Sed 3.46 * This version is not an official GNU release, hence it is dubbed `super-sed' and uses a strange version number unlikely to clash with GNU sed's numbering. It is my hope to merge super-sed's changes with GNU sed one day, but at the moment they should be considered separate programs at all effects. * It uses a different regular expression matcher which is much more faster (6x to 20x), especially on backreferences. * Bug fix: if a file was redirected to be stdin, sed did not consume it. So (sed d; sed G) < TESTFILE double-spaced TESTFILE, while the equivalent `useless use of cat' cat TESTFILE | (sed d; sed G) printed nothing (which is the correct behavior). A test for this bug was added to the test suite. * A bug in the test suite (the khadafy test was run with BREs instead of EREs) has been corrected. * The documentation is now much better, with a few examples provided, and a thorough description of regular expressions. The manual often refers to "GNU extensions", but if they are described here they are specific to this version. * Added new command-line options: -r, --regexp-extended Use extended regexps -- e.g. (abc+) instead of \(abc\+\) -R, --regexp-perl Use Perl regexps (\l, \L, \u, \U, \E not supported) * Added feature to the `w' command and to the `w' option of the `s' command: if the file name is /dev/stderr, it means the standard error (inspired by awk). This is disabled if POSIXLY_CORRECT is set. * Added `m' and `M' modifiers to `s' command for multi-line matching (Perl-style); in addresses, only `M' works. * Added `Q' command for `silent quit'; added ability to pass an exit code from a sed script to the caller. * Added `T' command for `branch if failed'. * Added `v' command, which is a do-nothing intended to fail on seds that do not support super-sed's extensions. * Bootstrapping was tested and is known to work. ---------------------------------------------------------------------------- Sed 3.02.80 * Started new version nomenclature for pre-3.03 releases. (I'm being pessimistic in assuming that .90 won't give me enough breathing room.) * Bug fixes: the regncomp()/regnexec() interfaces proved to be inadequate to properly handle expressions such as "s/\ after a, i, and c commands). Also, conditionally (on NO_INPUT_INDENT) added experimental support for skipping leading whitespace on each {a,i,c} input line. * Added addressing of the form: /foo/,+5 p (print from foo to 5th line following) /foo/,~5 p (print from foo to next line whose line number is a multiple of 5) The first address of these can be any of the previously existing addressing types; the +N and ~N forms are only allowed as the second address of a range. * Added support for pseudo-address "0" as the first address in an address-range, simplifying scripts which happen to match the end address on the first line of input. For example, a script which deletes all lines from the beginning of the file to the first line which contains "foo" is now simply "sed 0,/foo/d", whereas before one had to go through contortions to deal with the possibility that "foo" might appear on the first line of the input. * Made NUL characters in regexps work "correctly" --- i.e., a NUL in a RE matches a NUL; it does not prematurely terminate the RE. (This only works in -f scripts, as the POSIX.1 exec*() interface only passes NUL-terminated strings, and so sed will only be able to see up to the first NUL in any -e scriptlet.) * Wherever a `;' is accepted as a command terminator, also allow a `}' or a `#' to appear. (This allows for less cluttered-looking scripts.) * Lots of internal changes that are only relevant to source junkies and development testing. Some of which might cause imperceptible performance improvements. ---------------------------------------------------------------------------- Sed 3.02 * Fixed a bug in the parsing of character classes (e.g., /[[:space:]]/). Corrected an omission in djgpp/Makefile.am and an improper dependency in testsuite/Makefile.am. ---------------------------------------------------------------------------- Sed 3.01 * This version of sed mainly contains bug fixes and portability enhancements, plus performance enhancements related to sed's handling of input files. Due to excess performance penalties, I have reverted (relative to 3.00) to using regex.c instead of the rx package for regular expression handling, at the expense of losing true POSIX.2 BRE compatibility. However, performance related to regular expression handling *still* needs a fair bit of work. * One new feature has been added: regular expressions may be followed with an "I" directive ("i" was taken [the "i"nsert command]) to indicate that the regexp should be matched in a case-insensitive manner. Also of note are a new organization to the source code, new documentation, and a new maintainer. ---------------------------------------------------------------------------- Sed 3.0 * This version of sed passes the new test-suite donated by Jason Molenda. * Overall performance has been improved in the following sense: Sed 3.0 is often slightly slower than sed 2.05. On a few scripts, though, sed 2.05 was so slow as to be nearly useless or to use up unreasonable amounts of memory. These problems have been fixed and in such cases, sed 3.0 should have acceptable performance. sed-3.62/README0000644000076600007660000000106510143133571010034 00000000000000This is a version of sed based on GNU sed. It is not a version of GNU sed, though. There are several new features, including extended regular expression syntax, and some bug fixes; see the NEWS file for a brief summary and the ChangeLog for more detailed descriptions of changes. See the file INSTALL for generic compilation and installation instructions. See the file BUGS for instructions about reporting bugs. The file README.boot gives instructions for making a "bootstrap" version of sed on systems which lack any pre-existing and working version of sed. sed-3.62/README.boot0000644000076600007660000000231510143133571010775 00000000000000Because a working sed is a prerequisite for running the ``configure'' script, I have provided the script ``bootstrap.sh'' which will attempt to build a version of sed adequate for running ``configure''. If it fails, edit the ``config.h'' file that was created according to the comments found therein, and then try running ``bootstrap.sh'' again. The bootstrap build is quite likely to babble on and on with various compiler warnings. You may want to tell bootstrap.sh how to invoke your compiler with warnings disabled. For example, with a Bourne-like shell and gcc one could use: $ CC='gcc -w' sh bootstrap.sh or with a csh-like shell, one could try: % env CC='gcc -w' sh bootstrap.sh Once you get a working version of sed, temporarily install sed/sed somewhere in your $PATH, and then really re-build the normal way (starting with ``sh configure''); the bootstrap version is almost certainly more crippled than it needs to be on your machine. I don't much care to hear about any bugs in ``bootstrap'' versions of sed beyond those which actually keep the ``bootstrap'' version from building, or sed's configure script from running properly. I am especially uninterested in compiler warnings from the bootstrap build. sed-3.62/THANKS0000644000076600007660000000327410202143533010066 00000000000000Akim Demaille Alan Modra Arnold Robbins Andreas Schwab Andrew Herbert Bruno Haible Chip Salzenberg Chris Weber David Eckelkamp David J. MacKenzie David Schmidt Dietrich Kappe Doug McIlroy Eli Zaretskii Eric Pement Erick Branderhorst Francois Pinard Gaumond Pierre Greg Ubben Isamu Hasegawa J.T. Conklin Jakub Jelinek Jason Molenda Jim Meyering Laurent Vogel Karl Berry Karl Heuer Kaveh R. Ghazi Kevin Buettner Mark Kettenis Michael De La Rue Michel de Ruiter Paul Eggert Robert A Bruce Ronnie Glasscock Simon Taylor Stepan Kasal Stephen Davis Steve Ingram Tapani Tarvainen Timothy J Luoma Tom R.Hageman Ulrich Drepper Vladimir Volovich Wichert Akkerman And the GNU translation teams. sed-3.62/TODO0000644000076600007660000000010210143133571007633 00000000000000* Make pcre/reg{perl,posix}.c handle [[=x=]] and [[.x.]] and MBCS sed-3.62/aclocal.m40000644000076600007660000011575110202173535011024 00000000000000# generated automatically by aclocal 1.9.2 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # -*- Autoconf -*- # Copyright (C) 2002, 2003 Free Software Foundation, Inc. # Generated from amversion.in; do not edit by hand. # 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., 59 Temple Place - Suite 330, Boston, MA # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.9.2])]) # AM_AUX_DIR_EXPAND # Copyright (C) 2001, 2003 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 6 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # serial 7 -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 # 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH]) ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 # 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. #serial 2 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 7 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # This macro actually does too much some checks are only needed if # your package does certain things. But this isn't really a big deal. # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 11 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.58])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. # Copyright (C) 2001, 2003 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # -*- Autoconf -*- # Copyright (C) 2003 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 1 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 2 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # Copyright (C) 2003, 2004 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 2 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # # Check to make sure that the build environment is sane. # # Copyright (C) 1996, 1997, 2000, 2001, 2003 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # AM_PROG_INSTALL_STRIP # Copyright (C) 2001, 2003 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 1 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([config/codeset.m4]) m4_include([config/getline.m4]) m4_include([config/gettext-ver.m4]) m4_include([config/gettext.m4]) m4_include([config/glibc21.m4]) m4_include([config/iconv.m4]) m4_include([config/lcmessage.m4]) m4_include([config/lib-ld.m4]) m4_include([config/lib-link.m4]) m4_include([config/lib-prefix.m4]) m4_include([config/progtest.m4]) m4_include([config/stdbool.m4]) m4_include([config/strverscmp.m4]) sed-3.62/basicdefs.h0000644000076600007660000001407110144674126011260 00000000000000/* GNU SED, a batch stream editor. Copyright (C) 1998, 1999, 2002, 2003 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef BASICDEFS_H #define BASICDEFS_H #if defined(_AIX) #pragma alloca #else # if !defined(alloca) /* predefined by HP cc +Olibcalls */ # ifdef __GNUC__ # define alloca(size) __builtin_alloca(size) # else # if HAVE_ALLOCA_H # include # else # if defined(__hpux) void *alloca (); # else # if !defined(__OS2__) && !defined(WIN32) char *alloca (); # else # include /* OS/2 defines alloca in here */ # endif # endif # endif # endif # endif #endif #ifdef HAVE_WCHAR_H # include #endif #ifdef HAVE_LOCALE_H # include #endif #ifdef HAVE_WCTYPE_H # include #endif #ifdef BOOTSTRAP # define false 0 # define true 1 # define bool unsigned # define __bool_true_false_are_defined 1 #else # include #endif #if ENABLE_NLS # include #else # define gettext(msgid) (msgid) # define ngettext(sing, plur, n) ((n) == 1 ? (sing) : (plur)) #endif #define _(String) gettext(String) #ifdef gettext_noop # define N_(String) gettext_noop(String) #else # define N_(String) (String) #endif /* type countT is used to keep track of line numbers, etc. */ typedef unsigned long countT; /* Oftentimes casts are used as an ugly hack to silence warnings * from the compiler. However, sometimes those warnings really * do point to something worth avoiding. I define this * dummy marker to make searching for them with a text editor * much easier, in case I want to verify that they are all * legitimate. It is defined in the way it is so that it is * easy to disable all casts so that the compiler (or lint) * can tell me potentially interesting things about what would * happen to the code without the explicit casts. */ #ifdef LOUD_LINT # define CAST(x) #else # define CAST(x) (x) #endif /* Can the compiler grok function prototypes? */ #if (defined __STDC__ && __STDC__-0) || defined __GNUC__ || defined __SUNPRO_C || __PROTOTYPES # define P_(s) s #else # define P_(s) () #endif /* (VOID *) is the generic pointer type; some ancient compilers don't know about (void *), and typically use (char *) instead. VCAST() is used to cast to and from (VOID *)s --- but if the compiler *does* support (void *) make this a no-op, so that the compiler can detect if we omitted an essential function declaration somewhere. */ #ifndef VOID # define VOID void # define VCAST(t) #else # define VCAST(t) (t) #endif /* some basic definitions to avoid undue promulgating of VCAST ugliness */ #define MALLOC(n,t) (VCAST(t *)ck_malloc((n)*sizeof(t))) #define REALLOC(x,n,t) (VCAST(t *)ck_realloc(VCAST(VOID *)(x),(n)*sizeof(t))) #define MEMDUP(x,n,t) (VCAST(t *)ck_memdup(VCAST(VOID *)(x),(n)*sizeof(t))) #define FREE(x) (ck_free(VCAST(VOID *)x)) #define MEMCPY(d,s,l) (memcpy(VCAST(VOID *)(d),VCAST(const VOID *)(s),l)) #define MEMMOVE(d,s,l) (memmove(VCAST(VOID *)(d),VCAST(const VOID *)(s),l)) #define OB_MALLOC(o,n,t) (VCAST(t *)obstack_alloc(o,(n)*sizeof(t))) #define obstack_chunk_alloc ck_malloc #define obstack_chunk_free ck_free #ifdef HAVE_MEMORY_H # include #endif #ifndef HAVE_MEMMOVE # ifndef memmove /* ../lib/libsed.a provides a memmove() if the system doesn't. Here is where we declare its return type; we don't prototype it because that sometimes causes problems when we're running in bootstrap mode on a system which really does support memmove(). */ extern VOID *memmove(); # endif #endif #ifndef HAVE_MEMCPY # ifndef memcpy # define memcpy(d, s, n) memmove(d, s, n) # endif #endif #ifndef HAVE_STRERROR extern char *strerror P_((int e)); #endif /* handle misdesigned macros (snarfed from lib/regex.c) */ /* Jim Meyering writes: "... Some ctype macros are valid only for character codes that isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when using /bin/cc or gcc but without giving an ansi option). So, all ctype uses should be through macros like ISPRINT... If STDC_HEADERS is defined, then autoconf has verified that the ctype macros don't need to be guarded with references to isascii. ... Defining isascii to 1 should let any compiler worth its salt eliminate the && through constant folding." Solaris defines some of these symbols so we must undefine them first. */ #undef ISASCII #if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) # define ISASCII(c) 1 #else # define ISASCII(c) isascii(c) #endif #if defined isblank || defined HAVE_ISBLANK # define ISBLANK(c) (ISASCII (c) && isblank (c)) #else # define ISBLANK(c) ((c) == ' ' || (c) == '\t') #endif #undef ISPRINT #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 initialize_main # ifdef __EMX__ # define initialize_main(argcp, argvp) \ { _response(argcp, argvp); _wildcard(argcp, argvp); } # else /* NOT __EMX__ */ # define initialize_main(argcp, argvp) # endif #endif #endif /*!BASICDEFS_H*/ sed-3.62/bootstrap.sh0000755000076600007660000000626310202173631011532 00000000000000#! /bin/sh # edit this to taste; note that you can also override via the environment: case "$CC" in "") CC=cc esac if test -f config.h; then :; else echo "Creating basic config.h..." cat >config.h <<'END_OF_CONFIG_H' /* A bootstrap version of config.h, for systems which can't auto-configure due to a lack of a working sed. If you are on a sufficiently odd machine you may need to hand-tweak this file. Regardless, once you get a working version of sed you really should re-build starting with a run of "configure", as the bootstrap version is almost certainly more crippled than it needs to be on your machine. */ #define PACKAGE "sed" #define VERSION "3.62-boot" #define SED_FEATURE_VERSION "4.1" #define BOOTSTRAP 1 /* Define if your compiler/headers don't support const. */ #undef const /* Undefine if headers have conflicting definition. */ #define mbstate_t int /* Toggle if you encounter errors in lib/mkstemp.c. */ #define HAVE_UNISTD_H #define HAVE_FCNTL_H #undef HAVE_SYS_FILE_H #undef HAVE_IO_H /* Undefine if or has conflicting definition. */ #define size_t unsigned #define ssize_t int /* If your antique compiler doesn't grok ``void *'', then #define VOID char */ #undef VOID /* All other config.h.in options intentionally omitted. Report as a bug if you need extra "#define"s in here. */ END_OF_CONFIG_H fi # tell the user what we're doing from here on... set -x -e # the ``|| exit 1''s are for fail-stop; set -e doesn't work on some systems rm -f lib/*.o sed/*.o sed/sed cd lib || exit 1 rm -f regex.h cp regex_.h regex.h ${CC} -DHAVE_CONFIG_H -I.. -I. -c alloca.c ${CC} -DHAVE_CONFIG_H -I.. -I. -c getline.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c getopt.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c getopt1.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c memchr.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c memcmp.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c memmove.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c mkstemp.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c strverscmp.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c obstack.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c regex.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c strerror.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c utils.c || exit 1 cd ../pcre || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regdebug.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regexp.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c reginfo.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regperl.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regposix.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regstudy.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regsub.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regtables.c || exit 1 cd ../sed || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c sed.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c fmt.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c compile.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c execute.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c mbcs.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regexp.c || exit 1 ${CC} -o sed *.o ../lib/*.o || exit 1 sed-3.62/bootstrap.sh.in0000755000076600007660000000631210143133571012135 00000000000000#! /bin/sh # edit this to taste; note that you can also override via the environment: case "$CC" in "") CC=cc esac if test -f config.h; then :; else echo "Creating basic config.h..." cat >config.h <<'END_OF_CONFIG_H' /* A bootstrap version of config.h, for systems which can't auto-configure due to a lack of a working sed. If you are on a sufficiently odd machine you may need to hand-tweak this file. Regardless, once you get a working version of sed you really should re-build starting with a run of "configure", as the bootstrap version is almost certainly more crippled than it needs to be on your machine. */ #define PACKAGE "sed" #define VERSION "@VERSION@-boot" #define SED_FEATURE_VERSION "@SED_FEATURE_VERSION@" #define BOOTSTRAP 1 /* Define if your compiler/headers don't support const. */ #undef const /* Undefine if headers have conflicting definition. */ #define mbstate_t int /* Toggle if you encounter errors in lib/mkstemp.c. */ #define HAVE_UNISTD_H #define HAVE_FCNTL_H #undef HAVE_SYS_FILE_H #undef HAVE_IO_H /* Undefine if or has conflicting definition. */ #define size_t unsigned #define ssize_t int /* If your antique compiler doesn't grok ``void *'', then #define VOID char */ #undef VOID /* All other config.h.in options intentionally omitted. Report as a bug if you need extra "#define"s in here. */ END_OF_CONFIG_H fi # tell the user what we're doing from here on... set -x -e # the ``|| exit 1''s are for fail-stop; set -e doesn't work on some systems rm -f lib/*.o sed/*.o sed/sed cd lib || exit 1 rm -f regex.h cp regex_.h regex.h ${CC} -DHAVE_CONFIG_H -I.. -I. -c alloca.c ${CC} -DHAVE_CONFIG_H -I.. -I. -c getline.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c getopt.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c getopt1.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c memchr.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c memcmp.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c memmove.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c mkstemp.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c strverscmp.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c obstack.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c regex.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c strerror.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -c utils.c || exit 1 cd ../pcre || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regdebug.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regexp.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c reginfo.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regperl.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regposix.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regstudy.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regsub.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regtables.c || exit 1 cd ../sed || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c sed.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c fmt.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c compile.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c execute.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c mbcs.c || exit 1 ${CC} -DHAVE_CONFIG_H -I.. -I. -I../lib -c regexp.c || exit 1 ${CC} -o sed *.o ../lib/*.o || exit 1 sed-3.62/config/0000777000076600007660000000000010202633236010502 500000000000000sed-3.62/config/codeset.m40000644000076600007660000000157610143704207012320 00000000000000# codeset.m4 serial AM1 (gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, [AC_TRY_LINK([#include ], [char* cs = nl_langinfo(CODESET);], am_cv_langinfo_codeset=yes, am_cv_langinfo_codeset=no) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE(HAVE_LANGINFO_CODESET, 1, [Define if you have and nl_langinfo(CODESET).]) fi ]) sed-3.62/config/config.guess0000755000076600007660000012466210143704266012757 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. timestamp='2004-08-11' # This file 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amd64:OpenBSD:*:*) echo x86_64-unknown-openbsd${UNAME_RELEASE} exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; cats:OpenBSD:*:*) echo arm-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; luna88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit 0 ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; *:OS400:*:*) echo powerpc-ibm-os400 exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in *86) UNAME_PROCESSOR=i686 ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms && exit 0 ;; I*) echo ia64-dec-vms && exit 0 ;; V*) echo vax-dec-vms && exit 0 ;; esac esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: sed-3.62/config/config.rpath0000755000076600007660000003236310143704201012730 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2002 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a shlibext= host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix3* | aix4* | aix5*) if test "$host_cpu" = ia64; then wl='-Wl,' fi ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6*) wl='-Wl,' ;; linux*) echo '__INTEL_COMPILER' > conftest.$ac_ext if $CC -E conftest.$ac_ext >/dev/null | grep __INTEL_COMPILER >/dev/null then : else # Intel icc wl='-Qoption,ld,' fi ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) if test "x$host_vendor" = xsni; then wl='-LD' else wl='-Wl,' fi ;; esac fi hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32* ) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then case "$host_os" in aix3* | aix4* | aix5*) # On AIX, the GNU linker is very broken ld_shlibs=no ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' ;; solaris* | sysv5*) if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) hardcode_libdir_separator=':' if test "$GCC" = yes; then collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi else hardcode_direct=yes fi if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else # Test if we are trying to use run time linking, or normal AIX style linking. # If -brtl is somewhere in LDFLAGS, we need to do run time linking. aix_use_runtimelinking=no for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl" ); then aix_use_runtimelinking=yes break fi done fi if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=yes ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9* | hpux10* | hpux11*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_minus_L=yes # Not in the search PATH, but as the default # location of the library. ;; irix5* | irix6*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; sco3.2v5*) ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) if test "x$host_vendor" = xsno; then hardcode_direct=yes # is this really true??? else hardcode_direct=no # Motorola manual says yes, but my tests say they lie fi ;; sysv4.3*) ;; sysv5*) hardcode_libdir_flag_spec= ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4.2uw2*) hardcode_direct=yes hardcode_minus_L=no ;; sysv5uw7* | unixware7*) ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics libname_spec='lib$name' sys_lib_dlsearch_path_spec="/lib /usr/lib" sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" case "$host_os" in aix3*) shlibext=so ;; aix4* | aix5*) shlibext=so ;; amigaos*) shlibext=ixlibrary ;; beos*) shlibext=so ;; bsdi4*) shlibext=so sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" ;; cygwin* | mingw* | pw32*) case $GCC,$host_os in yes,cygwin*) shlibext=dll.a ;; yes,mingw*) shlibext=dll sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"` ;; yes,pw32*) shlibext=dll ;; *) shlibext=dll ;; esac ;; darwin* | rhapsody*) shlibext=dylib ;; freebsd1*) ;; freebsd*) shlibext=so ;; gnu*) shlibext=so ;; hpux9* | hpux10* | hpux11*) shlibext=sl ;; irix5* | irix6*) shlibext=so case "$host_os" in irix5*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 ") libsuff= shlibsuff= ;; *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" ;; linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) ;; linux-gnu*) shlibext=so ;; netbsd*) shlibext=so ;; newsos6) shlibext=so ;; openbsd*) shlibext=so ;; os2*) libname_spec='$name' shlibext=dll ;; osf3* | osf4* | osf5*) shlibext=so sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) shlibext=so ;; solaris*) shlibext=so ;; sunos4*) shlibext=so ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) shlibext=so case "$host_vendor" in motorola) sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; uts4*) shlibext=so ;; dgux*) shlibext=so ;; sysv4*MP*) if test -d /usr/nec; then shlibext=so fi ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_sys_lib_search_path_spec=`echo "X$sys_lib_search_path_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_sys_lib_dlsearch_path_spec=`echo "X$sys_lib_dlsearch_path_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: sed-3.62/config/depcomp0000755000076600007660000003554510143704266012015 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2004-05-31.23 # Copyright (C) 1999, 2000, 2003, 2004 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit 0 ;; -v | --v*) echo "depcomp $scriptversion" exit 0 ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # Dependencies are output in .lo.d with libtool 1.4. # With libtool 1.5 they are output both in $dir.libs/$base.o.d # and in $dir.libs/$base.o.d and $dir$base.o.d. We process the # latter, because the former will be cleaned when $dir.libs is # erased. tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir$base.o.d" tmpdepfile3="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" tmpdepfile3="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" elif test -f "$tmpdepfile2"; then tmpdepfile="$tmpdepfile2" else tmpdepfile="$tmpdepfile3" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sed-3.62/config/getline.m40000644000076600007660000000256210143133571012315 00000000000000#serial 4 dnl See if there's a working, system-supplied version of the getline function. dnl We can't just do AC_REPLACE_FUNCS(getline) because some systems dnl have a function by that name in -linet that doesn't have anything dnl to do with the function we need. AC_DEFUN([AM_FUNC_GETLINE], [dnl am_getline_needs_run_time_check=no AC_CHECK_FUNC(getline, dnl Found it in some library. Verify that it works. am_getline_needs_run_time_check=yes, am_cv_func_working_getline=no) if test $am_getline_needs_run_time_check = yes; then AC_CACHE_CHECK([for working getline function], am_cv_func_working_getline, [echo fooN |tr -d '\012'|tr N '\012' > conftest.data AC_TRY_RUN([ # include # include # include int main () { /* Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len; FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; len = getline (&line, &siz, in); exit ((len == 4 && line && strcmp (line, "foo\n") == 0) ? 0 : 1); } ], am_cv_func_working_getline=yes dnl The library version works. , am_cv_func_working_getline=no dnl The library version does NOT work. , am_cv_func_working_getline=no dnl We're cross compiling. )]) fi if test $am_cv_func_working_getline = no; then AC_LIBOBJ(getline) fi ]) sed-3.62/config/gettext-ver.m40000644000076600007660000000004710143133571013140 00000000000000AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) sed-3.62/config/gettext.m40000644000076600007660000005232610143704207012355 00000000000000# gettext.m4 serial 12 (gettext-0.11) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2002. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])]) define(gt_included_intl, ifelse([$1], [external], [no], [yes])) define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. dnl Add a version number to the cache macros. define([gt_api_version], ifelse([$2], [need-ngettext], 2, 1)) define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, [AC_TRY_LINK([#include extern int _nl_msg_cat_cntr;], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no)]) if test "$gt_cv_func_gnugettext_libc" != "yes"; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], gt_cv_func_gnugettext_libintl, [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include extern int _nl_msg_cat_cntr;], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr], gt_cv_func_gnugettext_libintl=yes, gt_cv_func_gnugettext_libintl=no) dnl Now see whether libintl exists and depends on libiconv. if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include extern int _nl_msg_cat_cntr;], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_func_gnugettext_libintl=yes ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if test "$gt_cv_func_gnugettext_libc" = "yes" \ || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ && test "$PACKAGE" != gettext; }; then gt_use_preinstalled_gnugettext=yes fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. INTLOBJS="\$(GETTOBJS)" BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext_libintl" = "yes"; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) AC_SUBST(INTLOBJS) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl Checks for all prerequisites of the po subdirectory, dnl except for USE_NLS. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Search for GNU xgettext 0.11 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU msgfmt. if test "$GMSGFMT" != ":"; then dnl If it is no GNU msgfmt we define it as : so that the dnl Makefiles still can work. if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` AC_MSG_RESULT( [found $GMSGFMT program is not GNU msgfmt; ignore it]) GMSGFMT=":" fi fi dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is no GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po fi AC_OUTPUT_COMMANDS([ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' fi case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= GMOFILES= UPDATEPOFILES= DUMMYPOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done], [# Capture the value of obsolete $ALL_LINGUAS because we need it to compute # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it # from automake. eval 'ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Checks for all prerequisites of the intl subdirectory, dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. AC_DEFUN([AM_INTL_SUBDIR], [ AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_RANLIB])dnl AC_REQUIRE([AC_ISC_POSIX])dnl AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_C_CONST])dnl AC_REQUIRE([AC_C_INLINE])dnl AC_REQUIRE([AC_TYPE_OFF_T])dnl AC_REQUIRE([AC_TYPE_SIZE_T])dnl AC_REQUIRE([AC_FUNC_ALLOCA])dnl AC_REQUIRE([AC_FUNC_MMAP])dnl AC_REQUIRE([jm_GLIBC21])dnl AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ stdlib.h string.h unistd.h sys/param.h]) AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) AM_ICONV AM_LANGINFO_CODESET AM_LC_MESSAGES dnl intl/plural.c is generated from intl/plural.y. It requires bison, dnl because plural.y uses bison specific features. It requires at least dnl bison-1.26 because earlier versions generate a plural.c that doesn't dnl compile. dnl bison is only needed for the maintainer (who touches plural.y). But in dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put dnl the rule in general Makefile. Now, some people carelessly touch the dnl files or have a broken "make" program, hence the plural.c rule will dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not dnl present or too old. AC_CHECK_PROGS([INTLBISON], [bison]) if test -z "$INTLBISON"; then ac_verc_fail=yes else dnl Found it, now check the version. AC_MSG_CHECKING([version of bison]) changequote(<<,>>)dnl ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) changequote([,])dnl ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac AC_MSG_RESULT([$ac_prog_version]) fi if test $ac_verc_fail = yes; then INTLBISON=: fi ]) AC_DEFUN([AM_MKINSTALLDIRS], [ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but $(top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) ]) sed-3.62/config/glibc21.m40000644000076600007660000000172710143704207012113 00000000000000# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # Test for the GNU C Library, version 2.1 or newer. # From Bruno Haible. AC_DEFUN([jm_GLIBC21], [ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, ac_cv_gnu_library_2_1, [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif ], ac_cv_gnu_library_2_1=yes, ac_cv_gnu_library_2_1=no) ] ) AC_SUBST(GLIBC21) GLIBC21="$ac_cv_gnu_library_2_1" ] ) sed-3.62/config/help2man0000755000076600007660000003056410143133571012063 00000000000000#!/usr/bin/env perl # Generate a short man page from --help and --version output. # Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Written by Brendan O'Dea # Available from ftp://ftp.gnu.org/gnu/help2man/ use 5.005; use strict; use Getopt::Long; use Text::Tabs qw(expand); use POSIX qw(strftime setlocale LC_TIME); my $this_program = 'help2man'; my $this_version = '1.28'; my $version_info = < EOT my $help_info = <. EOT my $section = 1; my $manual = ''; my $source = ''; my $help_option = '--help'; my $version_option = '--version'; my ($opt_name, @opt_include, $opt_output, $opt_info, $opt_no_info); my %opt_def = ( 'n|name=s' => \$opt_name, 's|section=s' => \$section, 'm|manual=s' => \$manual, 'S|source=s' => \$source, 'i|include=s' => sub { push @opt_include, [ pop, 1 ] }, 'I|opt-include=s' => sub { push @opt_include, [ pop, 0 ] }, 'o|output=s' => \$opt_output, 'p|info-page=s' => \$opt_info, 'N|no-info' => \$opt_no_info, 'h|help-option=s' => \$help_option, 'v|version-option=s' => \$version_option, ); # Parse options. Getopt::Long::config('bundling'); GetOptions (%opt_def, help => sub { print $help_info; exit }, version => sub { print $version_info; exit }, ) or die $help_info; die $help_info unless @ARGV == 1; my %include = (); my %append = (); my @include = (); # retain order given in include file # Process include file (if given). Format is: # # [section name] # verbatim text # # or # # /pattern/ # verbatim text # while (@opt_include) { my ($inc, $required) = @{shift @opt_include}; next unless -f $inc or $required; die "$this_program: can't open `$inc' ($!)\n" unless open INC, $inc; my $key; my $hash = \%include; while () { # [section] if (/^\[([^]]+)\]/) { $key = uc $1; $key =~ s/^\s+//; $key =~ s/\s+$//; $hash = \%include; push @include, $key unless $include{$key}; next; } # /pattern/ if (m!^/(.*)/([ims]*)!) { my $pat = $2 ? "(?$2)$1" : $1; # Check pattern. eval { $key = qr($pat) }; if ($@) { $@ =~ s/ at .*? line \d.*//; die "$inc:$.:$@"; } $hash = \%append; next; } # Check for options before the first section--anything else is # silently ignored, allowing the first for comments and # revision info. unless ($key) { # handle options if (/^-/) { local @ARGV = split; GetOptions %opt_def; } next; } $hash->{$key} ||= ''; $hash->{$key} .= $_; } close INC; die "$this_program: no valid information found in `$inc'\n" unless $key; } # Compress trailing blank lines. for my $hash (\(%include, %append)) { for (keys %$hash) { $hash->{$_} =~ s/\n+$/\n/ } } # Turn off localisation of executable's ouput. @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; # Turn off localisation of date (for strftime). setlocale LC_TIME, 'C'; # Grab help and version info from executable. my ($help_text, $version_text) = map { join '', map { s/ +$//; expand $_ } `$ARGV[0] $_ 2>/dev/null` or die "$this_program: can't get `$_' info from $ARGV[0]\n" } $help_option, $version_option; my $date = strftime "%B %Y", localtime; (my $program = $ARGV[0]) =~ s!.*/!!; my $package = $program; my $version; if ($opt_output) { unlink $opt_output or die "$this_program: can't unlink $opt_output ($!)\n" if -e $opt_output; open STDOUT, ">$opt_output" or die "$this_program: can't create $opt_output ($!)\n"; } # The first line of the --version information is assumed to be in one # of the following formats: # # # # {GNU,Free} # ({GNU,Free} ) # - {GNU,Free} # # and seperated from any copyright/author details by a blank line. ($_, $version_text) = split /\n+/, $version_text, 2; if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or /^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/) { $program = $1; $package = $2; $version = $3; } elsif (/^((?:GNU|Free) +)?(\S+) +(.*)/) { $program = $2; $package = $1 ? "$1$2" : $2; $version = $3; } else { $version = $_; } $program =~ s!.*/!!; # No info for `info' itself. $opt_no_info = 1 if $program eq 'info'; # --name overrides --include contents. $include{NAME} = "$program \\- $opt_name\n" if $opt_name; # Default (useless) NAME paragraph. $include{NAME} ||= "$program \\- manual page for $program $version\n"; # Man pages traditionally have the page title in caps. my $PROGRAM = uc $program; # Set default page head/footers $source ||= "$program $version"; unless ($manual) { for ($section) { if (/^(1[Mm]|8)/) { $manual = 'System Administration Utilities' } elsif (/^6/) { $manual = 'Games' } else { $manual = 'User Commands' } } } # Extract usage clause(s) [if any] for SYNOPSIS. if ($help_text =~ s/^Usage:( +(\S+))(.*)((?:\n(?: {6}\1| *or: +\S).*)*)//m) { my @syn = $2 . $3; if ($_ = $4) { s/^\n//; for (split /\n/) { s/^ *(or: +)?//; push @syn, $_ } } my $synopsis = ''; for (@syn) { $synopsis .= ".br\n" if $synopsis; s!^\S*/!!; s/^(\S+) *//; $synopsis .= ".B $1\n"; s/\s+$//; s/(([][]|\.\.+)+)/\\fR$1\\fI/g; s/^/\\fI/ unless s/^\\fR//; $_ .= '\fR'; s/(\\fI)( *)/$2$1/g; s/\\fI\\fR//g; s/^\\fR//; s/\\fI$//; s/^\./\\&./; $synopsis .= "$_\n"; } $include{SYNOPSIS} ||= $synopsis; } # Process text, initial section is DESCRIPTION. my $sect = 'DESCRIPTION'; $_ = "$help_text\n\n$version_text"; # Normalise paragraph breaks. s/^\n+//; s/\n*$/\n/; s/\n\n+/\n\n/g; # Temporarily exchange leading dots, apostrophes and backslashes for # tokens. s/^\./\x80/mg; s/^'/\x81/mg; s/\\/\x82/g; # Start a new paragraph (if required) for these. s/([^\n])\n(Report +bugs|Email +bug +reports +to|Written +by)/$1\n\n$2/g; sub convert_option; while (length) { # Convert some standard paragraph names. if (s/^(Options|Examples): *\n//) { $sect = uc $1; next; } # Copyright section if (/^Copyright +[(\xa9]/) { $sect = 'COPYRIGHT'; $include{$sect} ||= ''; $include{$sect} .= ".PP\n" if $include{$sect}; my $copy; ($copy, $_) = split /\n\n/, $_, 2; for ($copy) { # Add back newline s/\n*$/\n/; # Convert iso9959-1 copyright symbol or (c) to nroff # character. s/^Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/mg; # Insert line breaks before additional copyright messages # and the disclaimer. s/(.)\n(Copyright |This +is +free +software)/$1\n.br\n$2/g; # Join hyphenated lines. s/([A-Za-z])-\n */$1/g; } $include{$sect} .= $copy; $_ ||= ''; next; } # Catch bug report text. if (/^(Report +bugs|Email +bug +reports +to) /) { $sect = 'REPORTING BUGS'; } # Author section. elsif (/^Written +by/) { $sect = 'AUTHOR'; } # Examples, indicated by an indented leading $, % or > are # rendered in a constant width font. if (/^( +)([\$\%>] )\S/) { my $indent = $1; my $prefix = $2; my $break = '.IP'; $include{$sect} ||= ''; while (s/^$indent\Q$prefix\E(\S.*)\n*//) { $include{$sect} .= "$break\n\\f(CW$prefix$1\\fR\n"; $break = '.br'; } next; } my $matched = ''; $include{$sect} ||= ''; # Sub-sections have a trailing colon and the second line indented. if (s/^(\S.*:) *\n / /) { $matched .= $& if %append; $include{$sect} .= qq(.SS "$1"\n); } my $indent = 0; my $content = ''; # Option with description. if (s/^( {1,10}([+-]\S.*?))(?:( +(?!-))|\n( {20,}))(\S.*)\n//) { $matched .= $& if %append; $indent = length ($4 || "$1$3"); $content = ".TP\n\x83$2\n\x83$5\n"; unless ($4) { # Indent may be different on second line. $indent = length $& if /^ {20,}/; } } # Option without description. elsif (s/^ {1,10}([+-]\S.*)\n//) { $matched .= $& if %append; $content = ".HP\n\x83$1\n"; $indent = 80; # not continued } # Indented paragraph with tag. elsif (s/^( +(\S.*?) +)(\S.*)\n//) { $matched .= $& if %append; $indent = length $1; $content = ".TP\n\x83$2\n\x83$3\n"; } # Indented paragraph. elsif (s/^( +)(\S.*)\n//) { $matched .= $& if %append; $indent = length $1; $content = ".IP\n\x83$2\n"; } # Left justified paragraph. else { s/(.*)\n//; $matched .= $& if %append; $content = ".PP\n" if $include{$sect}; $content .= "$1\n"; } # Append continuations. while (s/^ {$indent}(\S.*)\n//) { $matched .= $& if %append; $content .= "\x83$1\n" } # Move to next paragraph. s/^\n+//; for ($content) { # Leading dot and apostrophe protection. s/\x83\./\x80/g; s/\x83'/\x81/g; s/\x83//g; # Convert options. s/(^| )(-[][\w=-]+)/$1 . convert_option $2/mge; } # Check if matched paragraph contains /pat/. if (%append) { for my $pat (keys %append) { if ($matched =~ $pat) { $content .= ".PP\n" unless $append{$pat} =~ /^\./; $content .= $append{$pat}; } } } $include{$sect} .= $content; } # Refer to the real documentation. unless ($opt_no_info) { my $info_page = $opt_info || $program; $sect = 'SEE ALSO'; $include{$sect} ||= ''; $include{$sect} .= ".PP\n" if $include{$sect}; $include{$sect} .= < #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AC_REQUIRE([AM_ICONV_LINK]) if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) sed-3.62/config/install-sh0000755000076600007660000002177410143704263012440 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2004-07-05.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit 0;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit 0;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sed-3.62/config/lcmessage.m40000644000076600007660000000271310143704207012627 00000000000000# lcmessage.m4 serial 2 (gettext-0.10.40) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995. # Check whether LC_MESSAGES is available in . AC_DEFUN([AM_LC_MESSAGES], [if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) sed-3.62/config/lib-ld.m40000644000076600007660000000626010143704210012022 00000000000000# lib-ld.m4 serial 1 (gettext-0.11) dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. if $LD -v 2>&1 &5; then acl_cv_prog_gnu_ld=yes else acl_cv_prog_gnu_ld=no fi]) with_gnu_ld=$acl_cv_prog_gnu_ld ]) dnl From libtool-1.4. Sets the variable LD. AC_DEFUN([AC_LIB_PROG_LD], [AC_ARG_WITH(gnu-ld, [ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then test "$with_gnu_ld" != no && break else test "$with_gnu_ld" != yes && break fi fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) sed-3.62/config/lib-link.m40000644000076600007660000005276310143704210012371 00000000000000# lib-link.m4 serial 1 (gettext-0.11) dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes undefine([Name]) undefine([NAME]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. If found, it dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" LIBS="$LIBS $LIB[]NAME" AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, dnl hardcode_direct, hardcode_minus_L, dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec. AC_DEFUN([AC_LIB_RPATH], [ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH([lib$1-prefix], [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib$1-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "X$found_dir" = "X/usr/lib"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) sed-3.62/config/lib-prefix.m40000644000076600007660000001175510143704210012725 00000000000000# lib-prefix.m4 serial 1 (gettext-0.11) dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/lib"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) sed-3.62/config/mdate-sh0000755000076600007660000001147510143704263012061 00000000000000#!/bin/sh # Get modification time of a file or directory and pretty-print it. scriptversion=2003-11-09.00 # Copyright (C) 1995, 1996, 1997, 2003 Free Software Foundation, Inc. # written by Ulrich Drepper , June 1995 # # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No file. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: mdate-sh [--help] [--version] FILE Pretty-print the modification time of FILE. Report bugs to . EOF exit 0 ;; -v | --v*) echo "mdate-sh $scriptversion" exit 0 ;; esac # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME save_arg1="$1" # Find out how to get the extended ls output of a file or directory. if ls -L /dev/null 1>/dev/null 2>&1; then ls_command='ls -L -l -d' else ls_command='ls -l -d' fi # A `ls -l' line looks as follows on OS/2. # drwxrwx--- 0 Aug 11 2001 foo # This differs from Unix, which adds ownership information. # drwxrwx--- 2 root root 4096 Aug 11 2001 foo # # To find the date, we split the line on spaces and iterate on words # until we find a month. This cannot work with files whose owner is a # user named `Jan', or `Feb', etc. However, it's unlikely that `/' # will be owned by a user whose name is a month. So we first look at # the extended ls output of the root directory to decide how many # words should be skipped to get the date. # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. set - x`$ls_command /` # Find which argument is the month. month= command= until test $month do shift # Add another shift to the command. command="$command shift;" case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac done # Get the extended ls output of the file or directory. set - x`eval "$ls_command \"\$save_arg1\""` # Remove all preceding arguments eval $command # Get the month. Next argument is day, followed by the year or time. case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac day=$2 # Here we have to deal with the problem that the ls output gives either # the time of day or the year. case $3 in *:*) set `date`; eval year=\$$# case $2 in Jan) nummonthtod=1;; Feb) nummonthtod=2;; Mar) nummonthtod=3;; Apr) nummonthtod=4;; May) nummonthtod=5;; Jun) nummonthtod=6;; Jul) nummonthtod=7;; Aug) nummonthtod=8;; Sep) nummonthtod=9;; Oct) nummonthtod=10;; Nov) nummonthtod=11;; Dec) nummonthtod=12;; esac # For the first six month of the year the time notation can also # be used for files modified in the last year. if (expr $nummonth \> $nummonthtod) > /dev/null; then year=`expr $year - 1` fi;; *) year=$3;; esac # The result. echo $day $month $year # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sed-3.62/config/missing0000755000076600007660000002466610143704263012036 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2003-09-02.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: sed-3.62/config/progtest.m40000644000076600007660000000407410143704210012527 00000000000000# progtest.m4 serial 2 (gettext-0.10.40) dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) sed-3.62/config/stdbool.m40000644000076600007660000000402510143133571012330 00000000000000# Check for stdbool.h that conforms to C99. # Copyright (C) 2002-2003 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # This macro is only needed in autoconf <= 2.54. Newer versions of autoconf # have this macro built-in. AC_DEFUN([AC_HEADER_STDBOOL], [AC_CACHE_CHECK([for stdbool.h that conforms to C99], [ac_cv_header_stdbool_h], [AC_TRY_COMPILE( [ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: false is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) -0.5 == true ? 1 : -1]; bool e = &s; char f[(_Bool) -0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; ], [ return !a + !b + !c + !d + !e + !f + !g + !h + !i; ], [ac_cv_header_stdbool_h=yes], [ac_cv_header_stdbool_h=no])]) AC_CHECK_TYPES([_Bool]) if test $ac_cv_header_stdbool_h = yes; then AC_DEFINE(HAVE_STDBOOL_H, 1, [Define to 1 if stdbool.h conforms to C99.]) fi]) sed-3.62/config/strverscmp.m40000644000076600007660000000133510143133571013073 00000000000000# strverscmp.m4 serial 1 dnl Copyright (C) 2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. AC_DEFUN([gl_FUNC_STRVERSCMP], [ dnl Persuade glibc to declare strverscmp(). AC_REQUIRE([AC_GNU_SOURCE]) AC_REPLACE_FUNCS(strverscmp) if test $ac_cv_func_strverscmp = no; then gl_PREREQ_STRVERSCMP fi ]) # Prerequisites of lib/strverscmp.c. AC_DEFUN([gl_PREREQ_STRVERSCMP], [ : ]) sed-3.62/config/texi2dvi0000755000076600007660000005601310143133571012110 00000000000000#! /bin/sh # texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources. # $Id: texi2dvi,v 1.14 2003/02/05 00:42:33 karl Exp $ # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, # 2002, 2003 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, you can either send email to this # program's maintainer or write to: The Free Software Foundation, # Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA. # # Original author: Noah Friedman . # # Please send bug reports, etc. to bug-texinfo@gnu.org. # If possible, please send a copy of the output of the script called with # the `--debug' option when making a bug report. # This string is expanded by rcs automatically when this file is checked out. rcs_revision='$Revision: 1.14 $' rcs_version=`set - $rcs_revision; echo $2` program=`echo $0 | sed -e 's!.*/!!'` version="texi2dvi (GNU Texinfo 4.5) $rcs_version Copyright (C) 2003 Free Software Foundation, Inc. There is NO warranty. You may redistribute this software under the terms of the GNU General Public License. For more information about these matters, see the files named COPYING." usage="Usage: $program [OPTION]... FILE... Run each Texinfo or LaTeX FILE through TeX in turn until all cross-references are resolved, building all indices. The directory containing each FILE is searched for included files. The suffix of FILE is used to determine its language (LaTeX or Texinfo). Makeinfo is used to perform Texinfo macro expansion before running TeX when needed. Operation modes: -b, --batch no interaction -c, --clean remove all auxiliary files -D, --debug turn on shell debugging (set -x) -h, --help display this help and exit successfully -o, --output=OFILE leave output in OFILE (implies --clean); Only one input FILE may be specified in this case -q, --quiet no output unless errors (implies --batch) -s, --silent same as --quiet -v, --version display version information and exit successfully -V, --verbose report on what is done TeX tuning: -@ use @input instead of \input; for preloaded Texinfo -e, -E, --expand force macro expansion using makeinfo -I DIR search DIR for Texinfo files -l, --language=LANG specify the LANG of FILE (LaTeX or Texinfo) -p, --pdf use pdftex or pdflatex for processing -t, --texinfo=CMD insert CMD after @setfilename in copy of input file multiple values accumulate The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO, TEX (or PDFTEX), and TEXINDEX environment variables are used to run those commands, if they are set. Email bug reports to , general questions and discussion to . Texinfo home page: http://www.gnu.org/software/texinfo/" # Initialize variables for option overriding and otherwise. # Don't use `unset' since old bourne shells don't have this command. # Instead, assign them an empty value. batch=false # eval for batch mode clean= debug= escape='\' expand= # t for expansion via makeinfo miincludes= # makeinfo include path oformat=dvi oname= # --output quiet= # by default let the tools' message be displayed set_language= textra= tmpdir=${TMPDIR:-/tmp}/t2d$$ # avoid collisions on 8.3 filesystems. txincludes= # TEXINPUTS extensions, with trailing colon txiprereq=19990129 # minimum texinfo.tex version to have macro expansion verbose=false # echo for verbose mode orig_pwd=`pwd` # Systems which define $COMSPEC or $ComSpec use semicolons to separate # directories in TEXINPUTS. if test -n "$COMSPEC$ComSpec"; then path_sep=";" else path_sep=":" fi # Pacify verbose cds. CDPATH=${ZSH_VERSION+.}$path_sep # In case someone crazy insists on using grep -E. : ${EGREP=egrep} # Save this so we can construct a new TEXINPUTS path for each file. TEXINPUTS_orig="$TEXINPUTS" # Unfortunately makeindex does not read TEXINPUTS. INDEXSTYLE_orig="$INDEXSTYLE" export TEXINPUTS INDEXSTYLE # Push a token among the arguments that will be used to notice when we # ended options/arguments parsing. # Use "set dummy ...; shift" rather than 'set - ..." because on # Solaris set - turns off set -x (but keeps set -e). # Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3 # still expand "$@" to a single argument (the empty string) rather # than nothing at all. arg_sep="$$--$$" set dummy ${1+"$@"} "$arg_sep"; shift # # Parse command line arguments. while test x"$1" != x"$arg_sep"; do # Handle --option=value by splitting apart and putting back on argv. case "$1" in --*=*) opt=`echo "$1" | sed -e 's/=.*//'` val=`echo "$1" | sed -e 's/[^=]*=//'` shift set dummy "$opt" "$val" ${1+"$@"}; shift ;; esac # This recognizes --quark as --quiet. So what. case "$1" in -@ ) escape=@;; # Silently and without documentation accept -b and --b[atch] as synonyms. -b | --b*) batch=eval;; -q | -s | --q* | --s*) quiet=t; batch=eval;; -c | --c*) clean=t;; -D | --d*) debug=t;; -e | -E | --e*) expand=t;; -h | --h*) echo "$usage"; exit 0;; -I | --I*) shift miincludes="$miincludes -I $1" txincludes="$txincludes$1$path_sep" ;; -l | --l*) shift; set_language=$1;; -o | --o*) shift clean=t case "$1" in /* | ?:/*) oname=$1;; *) oname="$orig_pwd/$1";; esac;; -p | --p*) oformat=pdf;; -t | --t*) shift; textra="$textra\\ $1";; -v | --vers*) echo "$version"; exit 0;; -V | --verb*) verbose=echo;; --) # What remains are not options. shift while test x"$1" != x"$arg_sep"; do set dummy ${1+"$@"} "$1"; shift shift done break;; -*) echo "$0: Unknown or ambiguous option \`$1'." >&2 echo "$0: Try \`--help' for more information." >&2 exit 1;; *) set dummy ${1+"$@"} "$1"; shift;; esac shift done # Pop the token shift # Interpret remaining command line args as filenames. case $# in 0) echo "$0: Missing file arguments." >&2 echo "$0: Try \`--help' for more information." >&2 exit 2 ;; 1) ;; *) if test -n "$oname"; then echo "$0: Can't use option \`--output' with more than one argument." >&2 exit 2 fi ;; esac # Prepare the temporary directory. Remove it at exit, unless debugging. if test -z "$debug"; then trap "cd / && rm -rf $tmpdir" 0 1 2 15 fi # Create the temporary directory with strict rights (umask 077 && mkdir $tmpdir) || exit 1 # Prepare the tools we might need. This may be extra work in some # cases, but improves the readibility of the script. utildir=$tmpdir/utils mkdir $utildir || exit 1 # A sed script that preprocesses Texinfo sources in order to keep the # iftex sections only. We want to remove non TeX sections, and # comment (with `@c texi2dvi') TeX sections so that makeinfo does not # try to parse them. Nevertheless, while commenting TeX sections, # don't comment @macro/@end macro so that makeinfo does propagate # them. Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo # doesn't work well enough (yet) to use that, so work around with sed. comment_iftex_sed=$utildir/comment.sed cat <$comment_iftex_sed /^@tex/,/^@end tex/{ s/^/@c texi2dvi/ } /^@iftex/,/^@end iftex/{ s/^/@c texi2dvi/ /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{ s/^@c texi2dvi// } } /^@html/,/^@end html/{ s/^/@c (texi2dvi)/ } /^@ifhtml/,/^@end ifhtml/{ s/^/@c (texi2dvi)/ } /^@ifnottex/,/^@end ifnottex/{ s/^/@c (texi2dvi)/ } /^@ifinfo/,/^@end ifinfo/{ /^@node/p /^@menu/,/^@end menu/p t s/^/@c (texi2dvi)/ } s/^@ifnotinfo/@c texi2dvi@ifnotinfo/ s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/ EOF # Uncommenting is simple: Remove any leading `@c texi2dvi'. uncomment_iftex_sed=$utildir/uncomment.sed cat <$uncomment_iftex_sed s/^@c texi2dvi// EOF # A shell script that computes the list of xref files. # Takes the filename (without extension) of which we look for xref # files as argument. The index files must be reported last. get_xref_files=$utildir/get_xref.sh cat <<\EOF >$get_xref_files #! /bin/sh # Get list of xref files (indexes, tables and lists). # Find all files having root filename with a two-letter extension, # saves the ones that are really Texinfo-related files. .?o? catches # many files: .toc, .log, LaTeX tables and lists, FiXme's .lox, maybe more. for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do # If file is empty, skip it. test -s "$this_file" || continue # If the file is not suitable to be an index or xref file, don't # process it. The file can't be if its first character is not a # backslash or single quote. first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file` if test "x$first_character" = "x\\" \ || test "x$first_character" = "x'"; then xref_files="$xref_files ./$this_file" fi done echo "$xref_files" EOF chmod 500 $get_xref_files # File descriptor usage: # 0 standard input # 1 standard output (--verbose messages) # 2 standard error # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 5 tools output (turned off by --quiet) # Tools' output. If quiet, discard, else redirect to the message flow. if test "$quiet" = t; then exec 5>/dev/null else exec 5>&1 fi # Enable tracing test "$debug" = t && set -x # # TeXify files. for command_line_filename in ${1+"$@"}; do $verbose "Processing $command_line_filename ..." # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex), # prepend `./' in order to avoid that the tools take it as an option. echo "$command_line_filename" | $EGREP '^(/|[A-z]:/)' >/dev/null \ || command_line_filename="./$command_line_filename" # See if the file exists. If it doesn't we're in trouble since, even # though the user may be able to reenter a valid filename at the tex # prompt (assuming they're attending the terminal), this script won't # be able to find the right xref files and so forth. if test ! -r "$command_line_filename"; then echo "$0: Could not read $command_line_filename, skipping." >&2 continue fi # Get the name of the current directory. We want the full path # because in clean mode we are in tmp, in which case a relative # path has no meaning. filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'` filename_dir=`cd "$filename_dir" >/dev/null && pwd` # Strip directory part but leave extension. filename_ext=`basename "$command_line_filename"` # Strip extension. filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'` ext=`echo "$filename_ext" | sed 's/^.*\.//'` # _src. Use same basename since we want to generate aux files with # the same basename as the manual. If --expand, then output the # macro-expanded file to here, else copy the original file. tmpdir_src=$tmpdir/src filename_src=$tmpdir_src/$filename_noext.$ext # _xtr. The file with the user's extra commands. tmpdir_xtr=$tmpdir/xtr filename_xtr=$tmpdir_xtr/$filename_noext.$ext # _bak. Copies of the previous xref files (another round is run if # they differ from the new one). tmpdir_bak=$tmpdir/bak # Make all those directories and give up if we can't succeed. mkdir $tmpdir_src $tmpdir_xtr $tmpdir_bak || exit 1 # Source file might include additional sources. # We want `.:$orig_pwd' before anything else. (We'll add `.:' later # after all other directories have been turned into absolute paths.) # `.' goes first to ensure that any old .aux, .cps, # etc. files in ${directory} don't get used in preference to fresher # files in `.'. Include orig_pwd in case we are in clean mode, where # we've cd'd to a temp directory. common="$orig_pwd$path_sep$filename_dir$path_sep$txincludes" TEXINPUTS="$common$TEXINPUTS_orig" INDEXSTYLE="$common$INDEXSTYLE_orig" # Convert relative paths to absolute paths, so we can run in another # directory (e.g., in --clean mode, or during the macro-support # detection.) # # Empty path components are meaningful to tex. We rewrite them # as `EMPTY' so they don't get lost when we split on $path_sep. TEXINPUTS=`echo $TEXINPUTS |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'` INDEXSTYLE=`echo $INDEXSTYLE |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'` save_IFS=$IFS IFS=$path_sep set x $TEXINPUTS; shift TEXINPUTS=. for dir do case $dir in EMPTY) TEXINPUTS=$TEXINPUTS$path_sep ;; [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expansed. TEXINPUTS=$TEXINPUTS$path_sep$dir ;; *) abs=`cd "$dir" && pwd` && TEXINPUTS=$TEXINPUTS$path_sep$abs ;; esac done set x $INDEXSTYLE; shift INDEXSTYLE=. for dir do case $dir in EMPTY) INDEXSTYLE=$INDEXSTYLE$path_sep ;; [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expansed. INDEXSTYLE=$INDEXSTYLE$path_sep$dir ;; *) abs=`cd "$dir" && pwd` && INDEXSTYLE=$INDEXSTYLE$path_sep$abs ;; esac done IFS=$save_IFS # If the user explicitly specified the language, use that. # Otherwise, if the first line is \input texinfo, assume it's texinfo. # Otherwise, guess from the file extension. if test -n "$set_language"; then language=$set_language elif sed 1q "$command_line_filename" | grep 'input texinfo' >/dev/null; then language=texinfo else language= fi # Get the type of the file (latex or texinfo) from the given language # we just guessed, or from the file extension if not set yet. case ${language:-$filename_ext} in [lL]a[tT]e[xX] | *.ltx | *.tex) # Assume a LaTeX file. LaTeX needs bibtex and uses latex for # compilation. No makeinfo. bibtex=${BIBTEX:-bibtex} makeinfo= # no point in running makeinfo on latex source. texindex=${MAKEINDEX:-makeindex} if test $oformat = dvi; then tex=${LATEX:-latex} else tex=${PDFLATEX:-pdflatex} fi ;; *) # Assume a Texinfo file. Texinfo files need makeinfo, texindex and tex. bibtex= texindex=${TEXINDEX:-texindex} if test $oformat = dvi; then tex=${TEX:-tex} else tex=${PDFTEX:-pdftex} fi # Unless required by the user, makeinfo expansion is wanted only # if texinfo.tex is too old. if test "$expand" = t; then makeinfo=${MAKEINFO:-makeinfo} else # Check if texinfo.tex performs macro expansion by looking for # its version. The version is a date of the form YEAR-MO-DA. # We don't need to use [0-9] to match the digits since anyway # the comparison with $txiprereq, a number, will fail with non # digits. txiversion_tex=txiversion.tex echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex # Run in the tmpdir to avoid leaving files. eval `cd $tmpdir >/dev/null && $tex $txiversion_tex 2>/dev/null | sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'` $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..." if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then makeinfo= else makeinfo=${MAKEINFO:-makeinfo} fi # As long as we had to run TeX, offer the user this convenience if test "$txiformat" = Texinfo; then escape=@ fi fi ;; esac # Expand macro commands in the original source file using Makeinfo. # Always use `end' footnote style, since the `separate' style # generates different output (arguably this is a bug in -E). # Discard main info output, the user asked to run TeX, not makeinfo. if test -n "$makeinfo"; then $verbose "Macro-expanding $command_line_filename to $filename_src ..." sed -f $comment_iftex_sed "$command_line_filename" \ | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \ -o /dev/null --macro-expand=- \ | sed -f $uncomment_iftex_sed >"$filename_src" filename_input=$filename_src fi # If makeinfo failed (or was not even run), use the original file as input. if test $? -ne 0 \ || test ! -r "$filename_src"; then $verbose "Reverting to $command_line_filename ..." filename_input=$filename_dir/$filename_ext fi # Used most commonly for @finalout, @smallbook, etc. if test -n "$textra"; then $verbose "Inserting extra commands: $textra" sed '/^@setfilename/a\ '"$textra" "$filename_input" >$filename_xtr filename_input=$filename_xtr fi # If clean mode was specified, then move to the temporary directory. if test "$clean" = t; then $verbose "cd $tmpdir_src" cd "$tmpdir_src" || exit 1 fi while :; do # will break out of loop below orig_xref_files=`$get_xref_files "$filename_noext"` # Save copies of originals for later comparison. if test -n "$orig_xref_files"; then $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`" cp $orig_xref_files $tmpdir_bak fi # Run bibtex on current file. # - If its input (AUX) exists. # - If AUX contains both `\bibdata' and `\bibstyle'. # - If some citations are missing (LOG contains `Citation'). # or the LOG complains of a missing .bbl # # We run bibtex first, because I can see reasons for the indexes # to change after bibtex is run, but I see no reason for the # converse. # # Don't try to be too smart. Running bibtex only if the bbl file # exists and is older than the LaTeX file is wrong, since the # document might include files that have changed. Because there # can be several AUX (if there are \include's), but a single LOG, # looking for missing citations in LOG is easier, though we take # the risk to match false messages. if test -n "$bibtex" \ && test -r "$filename_noext.aux" \ && test -r "$filename_noext.log" \ && (grep '^\\bibdata[{]' "$filename_noext.aux" \ && grep '^\\bibstyle[{]' "$filename_noext.aux" \ && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \ || grep 'No file .*\.bbl\.' "$filename_noext.log")) \ >/dev/null 2>&1; \ then $verbose "Running $bibtex $filename_noext ..." if $bibtex "$filename_noext" >&5; then :; else echo "$0: $bibtex exited with bad status, quitting." >&2 exit 1 fi fi # What we'll run texindex on -- exclude non-index files. # Since we know index files are last, it is correct to remove everything # before .aux and .?o?. But don't really do o # -- don't match whitespace as . # Otherwise, if orig_xref_files contains something like # foo.xo foo.whatever # the space after the o will get matched. index_files=`echo "$orig_xref_files" \ | sed "s!.*\.aux!!g; s!./$filename_noext\.[^ ]o[^ ]!!g; s/^[ ]*//;s/[ ]*$//"` # Run texindex (or makeindex) on current index files. If they # already exist, and after running TeX a first time the index # files don't change, then there's no reason to run TeX again. # But we won't know that if the index files are out of date or # nonexistent. if test -n "$texindex" && test -n "$index_files"; then $verbose "Running $texindex $index_files ..." if $texindex $index_files 2>&5 1>&2; then :; else echo "$0: $texindex exited with bad status, quitting." >&2 exit 1 fi fi # Finally, run TeX. # Prevent $ESCAPE from being interpreted by the shell if it happens # to be `/'. $batch tex_args="\\${escape}nonstopmode\ \\${escape}input" cmd="$tex $tex_args $filename_input" $verbose "Running $cmd ..." if $cmd >&5; then :; else echo "$0: $tex exited with bad status, quitting." >&2 echo "$0: see $filename_noext.log for errors." >&2 test "$clean" = t \ && cp "$filename_noext.log" "$orig_pwd" exit 1 fi # Decide if looping again is needed. finished=t # LaTeX (and the package changebar) report in the LOG file if it # should be rerun. This is needed for files included from # subdirs, since texi2dvi does not try to compare xref files in # subdirs. Performing xref files test is still good since LaTeX # does not report changes in xref files. if grep "Rerun to get" "$filename_noext.log" >/dev/null 2>&1; then finished= fi # Check if xref files changed. new_xref_files=`$get_xref_files "$filename_noext"` $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`" $verbose "New xref files = `echo $new_xref_files | sed 's|\./||g'`" # If old and new lists don't at least have the same file list, # then one file or another has definitely changed. test "x$orig_xref_files" != "x$new_xref_files" && finished= # File list is the same. We must compare each file until we find # a difference. if test -n "$finished"; then for this_file in $new_xref_files; do $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..." # cmp -s returns nonzero exit status if files differ. if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else # We only need to keep comparing until we find one that # differs, because we'll have to run texindex & tex again no # matter how many more there might be. finished= $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..." test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file" break fi done fi # If finished, exit the loop, else rerun the loop. test -n "$finished" && break done # If we were in clean mode, compilation was in a tmp directory. # Copy the DVI (or PDF) file into the directory where the compilation # has been done. (The temp dir is about to get removed anyway.) # We also return to the original directory so that # - the next file is processed in correct conditions # - the temporary file can be removed if test -n "$clean"; then if test -n "$oname"; then dest=$oname else dest=$orig_pwd fi $verbose "Copying $oformat file from `pwd` to $dest" cp -p "./$filename_noext.$oformat" "$dest" cd / # in case $orig_pwd is on a different drive (for DOS) cd $orig_pwd || exit 1 fi # Remove temporary files. if test "x$debug" = "x"; then $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..." cd / rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak fi done $verbose "$0 done." exit 0 # exit successfully, not however we ended the loop. sed-3.62/config/texinfo.tex0000644000076600007660000066500610143704263012634 00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2004-07-31.11} % % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software % Foundation, Inc. % % This texinfo.tex file 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 texinfo.tex file 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 texinfo.tex file; see the file COPYING. If not, write % to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, % Boston, MA 02111-1307, USA. % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. (This has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or % ftp://tug.org/tex/texinfo.tex % (and all CTAN mirrors, see http://www.ctan.org). % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \message{Basics,} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexnoindent=\noindent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexplus=+ \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % In some macros, we cannot use the `\? notation---the left quote is % in some cases the escape char. \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\questChar = `\? \chardef\semiChar = `\; \chardef\underChar = `\_ \chardef\spaceChar = `\ % \chardef\spacecat = 10 \def\spaceisspace{\catcode\spaceChar=\spacecat} % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt} % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\undefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % For @cropmarks command. % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \escapechar = `\\ % use backslash in output files. \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingxxx.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 2\baselineskip \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \normalturnoffactive \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1 \unvbox#1 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\next{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % We cannot use \next here, as it holds the macro to run; % thus we reuse \temp. \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \next. % (Similarily, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as enviroments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At runtime, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Evironment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty out of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} %% Simple single-character @ commands % @@ prints an @ % Kludge this until the fonts are right (grr). \def\@{{\tt\char64}} % This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. %% Define @` and @' to be the same as ` and ' %% but suppressing ligatures. %\def\`{{`}} %\def\'{{'}} % Used to generate quoted braces. \def\mylbrace {{\tt\char123}} \def\myrbrace {{\tt\char125}} \let\{=\mylbrace \let\}=\myrbrace \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux file. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \c \let\dotaccent = \. \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \t \let\ubaraccent = \b \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ptexi \else\ifx\temp\jmacro \j \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% \kern-.15em \TeX } % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=3000 } % @! is an end-of-sentence bang. \def\!{!\spacefactor=3000 } % @? is an end-of-sentence query. \def\?{?\spacefactor=3000 } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in % Old definition--didn't work. %\parseargdef\need{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak %\prevdepth=-1000pt %}} \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @include file insert text of that file as input. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable \def\temp{\input #1 }% \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\next\centerH \else \let\next\centerV \fi \next{\hfil \ignorespaces#1\unskip \hfil}% } \def\centerH#1{% {% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }% } \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} % @sp n outputs n lines of vertical space \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode\underChar = \active \gdef\mathunderscore{% \catcode\underChar=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a \ character. % FYI, plain.tex uses \\ as a temporary control sequence (why?), but % this is not advertised and we don't care. Texinfo does not % otherwise define @\. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus } } % @bullet and @minus need the same treatment as @math, just above. \def\bullet{$\ptexbullet$} \def\minus{$-$} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in a typewriter % font as three actual period characters. % \def\dots{% \leavevmode \hbox to 1.5em{% \hskip 0pt plus 0.25fil .\hfil.\hfil.% \hskip 0pt plus 0.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=3000 } % @comma{} is so commas can be inserted into text without messing up % Texinfo's parsing. % \let\comma = , % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as \undefined, % borrowed from ifpdf.sty. \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % \ifpdf \input pdfcolor \pdfcatalog{/PageMode /UseOutlines}% \def\dopdfimage#1#2#3{% \def\imagewidth{#2}% \def\imageheight{#3}% % without \immediate, pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifx\empty\imagewidth\else width \imagewidth \fi \ifx\empty\imageheight\else height \imageheight \fi \ifnum\pdftexversion<13 #1.pdf% \else {#1.pdf}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code in a section title % aren't expanded. \atdummies \normalturnoffactive \pdfdest name{#1} xyz% }} \def\pdfmkpgn#1{#1} \let\linkcolor = \Blue % was Cyan, but that seems light? \def\endlink{\Black\pdfendlink} % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node % text, which might be empty if this toc entry had no % corresponding node. #4 is the page number. % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worthwhile, since most documents are normally structured. \def\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}% } % \def\pdfmakeoutlines{% \begingroup % Thanh's hack / proper braces in bookmarks \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace % % Read toc silently, to get counts of subentries for \pdfoutline. \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \let\thissecnum\empty \let\thissubsecnum\empty }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \let\thissubsecnum\empty }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \let\thischapnum\empty \let\thissecnum\empty \let\thissubsecnum\empty % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \input \jobname.toc % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % xx to do this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Right % now, I guess we'll just let the pdf reader have its way. \indexnofonts \turnoffactive \input \jobname.toc \endgroup } % \def\makelinks #1,{% \def\params{#1}\def\E{END}% \ifx\params\E \let\nextmakelinks=\relax \else \let\nextmakelinks=\makelinks \ifnum\lnkcount>0,\fi \picknum{#1}% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{\the\pgn}}% \linkcolor #1% \advance\lnkcount by 1% \endlink \fi \nextmakelinks } \def\picknum#1{\expandafter\pn#1} \def\pn#1{% \def\p{#1}% \ifx\p\lbrace \let\nextpn=\ppn \else \let\nextpn=\ppnn \def\first{#1} \fi \nextpn } \def\ppn#1{\pgn=#1\gobble} \def\ppnn{\pgn=\first} \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,} \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \ifx\p\space\else\addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \fi \nextsp} \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi \def\pdfurl#1{% \begingroup \normalturnoffactive\def\@{@}% \makevalueexpandable \leavevmode\Red \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \linkcolor #1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\linkcolor = \relax \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Default leading. \newdimen\textleading \textleading = 13.2pt % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % \def\setleading#1{% \normalbaselineskip = #1\relax \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor \def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\undefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} %where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Text fonts (11.2pt, magstep1). \newcount\mainmagstep \ifx\bigger\relax % not really supported. \mainmagstep=\magstep1 \setfont\textrm\rmshape{12}{1000} \setfont\texttt\ttshape{12}{1000} \else \mainmagstep=\magstephalf \setfont\textrm\rmshape{10}{\mainmagstep} \setfont\texttt\ttshape{10}{\mainmagstep} \fi \setfont\textbf\bfshape{10}{\mainmagstep} \setfont\textit\itshape{10}{\mainmagstep} \setfont\textsl\slshape{10}{\mainmagstep} \setfont\textsf\sfshape{10}{\mainmagstep} \setfont\textsc\scshape{10}{\mainmagstep} \setfont\textttsl\ttslshape{10}{\mainmagstep} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1} \setfont\deftt\ttshape{10}{\magstep1} \setfont\defttsl\ttslshape{10}{\magstep1} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \setfont\smallrm\rmshape{9}{1000} \setfont\smalltt\ttshape{9}{1000} \setfont\smallbf\bfshape{10}{900} \setfont\smallit\itshape{9}{1000} \setfont\smallsl\slshape{9}{1000} \setfont\smallsf\sfshape{9}{1000} \setfont\smallsc\scshape{10}{900} \setfont\smallttsl\ttslshape{10}{900} \font\smalli=cmmi9 \font\smallsy=cmsy9 % Fonts for small examples (8pt). \setfont\smallerrm\rmshape{8}{1000} \setfont\smallertt\ttshape{8}{1000} \setfont\smallerbf\bfshape{10}{800} \setfont\smallerit\itshape{8}{1000} \setfont\smallersl\slshape{8}{1000} \setfont\smallersf\sfshape{8}{1000} \setfont\smallersc\scshape{10}{800} \setfont\smallerttsl\ttslshape{10}{800} \font\smalleri=cmmi8 \font\smallersy=cmsy8 % Fonts for title page (20.4pt): \setfont\titlerm\rmbshape{12}{\magstep3} \setfont\titleit\itbshape{10}{\magstep4} \setfont\titlesl\slbshape{10}{\magstep4} \setfont\titlett\ttbshape{12}{\magstep3} \setfont\titlettsl\ttslshape{10}{\magstep4} \setfont\titlesf\sfbshape{17}{\magstep1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\authorrm{\secrm} \def\authortt{\sectt} % Chapter (and unnumbered) fonts (17.28pt). \setfont\chaprm\rmbshape{12}{\magstep2} \setfont\chapit\itbshape{10}{\magstep3} \setfont\chapsl\slbshape{10}{\magstep3} \setfont\chaptt\ttbshape{12}{\magstep2} \setfont\chapttsl\ttslshape{10}{\magstep3} \setfont\chapsf\sfbshape{17}{1000} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 % Section fonts (14.4pt). \setfont\secrm\rmbshape{12}{\magstep1} \setfont\secit\itbshape{10}{\magstep2} \setfont\secsl\slbshape{10}{\magstep2} \setfont\sectt\ttbshape{12}{\magstep1} \setfont\secttsl\ttslshape{10}{\magstep2} \setfont\secsf\sfbshape{12}{\magstep1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 % Subsection fonts (13.15pt). \setfont\ssecrm\rmbshape{12}{\magstephalf} \setfont\ssecit\itbshape{10}{1315} \setfont\ssecsl\slbshape{10}{1315} \setfont\ssectt\ttbshape{12}{\magstephalf} \setfont\ssecttsl\ttslshape{10}{1315} \setfont\ssecsf\sfbshape{12}{\magstephalf} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 % Reduced fonts for @acro in text (10pt). \setfont\reducedrm\rmshape{10}{1000} \setfont\reducedtt\ttshape{10}{1000} \setfont\reducedbf\bfshape{10}{1000} \setfont\reducedit\itshape{10}{1000} \setfont\reducedsl\slshape{10}{1000} \setfont\reducedsf\sfshape{10}{1000} \setfont\reducedsc\scshape{10}{1000} \setfont\reducedttsl\ttslshape{10}{1000} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{25pt}} \def\titlefont#1{{\titlefonts\rm #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % % I wish the USA used A4 paper. % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \textfonts \rm % Define these so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000} \setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000} \setfont\shortconttt\ttshape{12}{1000} %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic % \smartitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else \ptexslash\fi\fi\fi} \def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} \def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally uses \ttsl. % @var is set to this for defun arguments. \def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitalicx} \let\i=\smartitalic \let\slanted=\smartslanted \let\var=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic \def\b#1{{\bf #1}} \let\strong=\b % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\frenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m } \catcode`@=\other \def\t#1{% {\tt \rawbackslash \frenchspacing #1}% \null } \def\samp#1{`\tclose{#1}'\null} \setfont\keyrm\rmshape{8}{1000} \font\keysy=cmsy9 \def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% \vbox{\hrule\kern-0.4pt \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% \kern-0.4pt\hrule}% \kern-.06em\raise0.4pt\hbox{\angleright}}}} % The old definition, with no lozenge: %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \frenchspacing #1% }% \null } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active % \global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex } } \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } \def\codex #1{\tclose{#1}\endgroup} % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\arg{#1}% \ifx\arg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\arg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\arg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle option `\arg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct.' \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\look}}\fi \else{\tclose{\kbdfont\look}}\fi} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. Perhaps eventually put in % a hypertex \special here. % \def\uref#1{\douref #1,,,\finish} \def\douref#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\frenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\undefined \def\Orb{\mathhexbox20D} \fi \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines \let\tt=\authortt} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rm #1} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\authorfont \leftline{#1}}% \fi } %%% Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -\baselineskip \global\advance\vsize by -\baselineskip } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\HEADINGSoff{% \global\evenheadline={\hfil} \global\evenfootline={\hfil} \global\oddheadline={\hfil} \global\oddfootline={\hfil}} \HEADINGSoff % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\undefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablex } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablex } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablex } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi \def\itemcontents{#1}% % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. Note that \everycr resets \everytab. \def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we encounter the problem it was intended to solve again. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. \let\item\crcr % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% test to see if user has set \multitablelinespace. % If so, do nothing. If not, give it an appropriate dimension based on % current baselineskip. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 %% strut to put in table in case some entry doesn't have descenders, %% to keep lines equally spaced \let\multistrut = \strut \else %% FIXME: what is \box0 supposed to be? \gdef\multistrut{\vrule height\multitablelinespace depth\dp0 width0pt\relax} \fi %% Test to see if parskip is larger than space between lines of %% table. If not, do nothing. %% If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1', which must be on a line % by itself. \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}% % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \obeylines % \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. \def\enddoignore{\endgroup\ignorespaces} % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within \newindex. {\catcode`\@=11 \gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \undefined % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname\donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % Need these in case \tex is in effect and \{ is a \delimiter again. % But can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. \let\{ = \mylbrace \let\} = \myrbrace % % \definedummyword defines \#1 as \realbackslash #1\space, thus % effectively preventing its expansion. This is used only for control % words, not control letters, because the \space would be incorrect % for control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword##1{% \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}% }% \def\definedummyletter##1{% \expandafter\def\csname ##1\endcsname{\realbackslash ##1}% }% \let\definedummyaccent\definedummyletter % % Do the redefinitions. \commondummies } % For the aux file, @ is the escape character. So we want to redefine % everything using @ instead of \realbackslash. When everything uses % @, this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % (See comments in \indexdummies.) \def\definedummyword##1{% \expandafter\def\csname ##1\endcsname{@##1\space}% }% \def\definedummyletter##1{% \expandafter\def\csname ##1\endcsname{@##1}% }% \let\definedummyaccent\definedummyletter % % Do the redefinitions. \commondummies } % Called from \indexdummies and \atdummies. \definedummyword and % \definedummyletter must be defined first. % \def\commondummies{% % \normalturnoffactive % \commondummiesnofonts % \definedummyletter{_}% % % Non-English letters. \definedummyword{AA}% \definedummyword{AE}% \definedummyword{L}% \definedummyword{OE}% \definedummyword{O}% \definedummyword{aa}% \definedummyword{ae}% \definedummyword{l}% \definedummyword{oe}% \definedummyword{o}% \definedummyword{ss}% \definedummyword{exclamdown}% \definedummyword{questiondown}% \definedummyword{ordf}% \definedummyword{ordm}% % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword{bf}% \definedummyword{gtr}% \definedummyword{hat}% \definedummyword{less}% \definedummyword{sf}% \definedummyword{sl}% \definedummyword{tclose}% \definedummyword{tt}% % \definedummyword{LaTeX}% \definedummyword{TeX}% % % Assorted special characters. \definedummyword{bullet}% \definedummyword{comma}% \definedummyword{copyright}% \definedummyword{registeredsymbol}% \definedummyword{dots}% \definedummyword{enddots}% \definedummyword{equiv}% \definedummyword{error}% \definedummyword{expansion}% \definedummyword{minus}% \definedummyword{pounds}% \definedummyword{point}% \definedummyword{print}% \definedummyword{result}% % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable % % Normal spaces, not active ones. \unsepspaces % % No macro expansion. \turnoffmacros } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % % Better have this without active chars. { \catcode`\~=\other \gdef\commondummiesnofonts{% % Control letters and accents. \definedummyletter{!}% \definedummyaccent{"}% \definedummyaccent{'}% \definedummyletter{*}% \definedummyaccent{,}% \definedummyletter{.}% \definedummyletter{/}% \definedummyletter{:}% \definedummyaccent{=}% \definedummyletter{?}% \definedummyaccent{^}% \definedummyaccent{`}% \definedummyaccent{~}% \definedummyword{u}% \definedummyword{v}% \definedummyword{H}% \definedummyword{dotaccent}% \definedummyword{ringaccent}% \definedummyword{tieaccent}% \definedummyword{ubaraccent}% \definedummyword{udotaccent}% \definedummyword{dotless}% % % Texinfo font commands. \definedummyword{b}% \definedummyword{i}% \definedummyword{r}% \definedummyword{sc}% \definedummyword{t}% % % Commands that take arguments. \definedummyword{acronym}% \definedummyword{cite}% \definedummyword{code}% \definedummyword{command}% \definedummyword{dfn}% \definedummyword{emph}% \definedummyword{env}% \definedummyword{file}% \definedummyword{kbd}% \definedummyword{key}% \definedummyword{math}% \definedummyword{option}% \definedummyword{samp}% \definedummyword{strong}% \definedummyword{tie}% \definedummyword{uref}% \definedummyword{url}% \definedummyword{var}% \definedummyword{verb}% \definedummyword{w}% } } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{% \expandafter\let\csname ##1\endcsname\asis }% % We can just ignore other control letters. \def\definedummyletter##1{% \expandafter\def\csname ##1\endcsname{}% }% % Hopefully, all control words can become @asis. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% % how to handle braces? \def\_{\normalunderscore}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\aa{aa}% \def\ae{ae}% \def\l{l}% \def\oe{oe}% \def\o{o}% \def\ss{ss}% \def\exclamdown{!}% \def\questiondown{?}% \def\ordf{a}% \def\ordm{o}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\registeredsymbol{R}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\expansion{==>}% \def\minus{-}% \def\pounds{pounds}% \def\point{.}% \def\print{-|}% \def\result{=>}% % % Don't write macro names. \emptyusermacros } \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \ifvmode \dosubindsanitize \else \dosubindwrite \fi }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \escapechar=`\\ \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write will make \lastskip zero. The result is that sequences % like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % % ..., ready, GO: % \def\dosubindsanitize{% % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \skip0 = \lastskip \edef\lastskipmacro{\the\lastskip}% \count255 = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\skip0 glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\skip0 \fi % \dosubindwrite % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\count255>9999 \penalty\count255 \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\skip0 \fi } % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \penalty -300 % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% \vskip .33\baselineskip plus .1\baselineskip % % Do our best not to break after the initial. \nobreak }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this frozes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \def\tempa{{\rm }}% \def\tempb{#1}% \edef\tempc{\tempa}% \edef\tempd{\tempb}% \ifx\tempc\tempd \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like \dotfill except takes at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % \unnumberedno is an oxymoron, of course. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines this as the name of the chapter. % page headings and footings can use it. @section does likewise. % However, they are not reliable, because we don't use marks. \def\thischapter{} \def\thissection{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achive this, remember the "biggest" unnum. sec. we are currently in: \chardef\unmlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unmlevel \chardef\unmlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unmlevel \def\headtype{U}% \else \chardef\unmlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % \message{\putwordChapter\space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % \def\appendixnum{\putwordAppendix\space \appendixletter}% \message{\appendixnum}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } \outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } \outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. \outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } \outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \bigskip \par\penalty 200\relax \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} \def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% \pchapsepmacro {% \chapfonts \rm % % Have to define \thissection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\thissection{#1}% \gdef\thischaptername{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \def\thischapter{#1}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \xdef\thischapter{}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% % We don't substitute the actual chapter name into \thischapter % because we don't want its macros evaluated now. And we don't % use \thissection because that changes with each section. % \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rm #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\sectionheading#1#2#3#4{% {% % Switch to the right set of fonts. \csname #2fonts\endcsname \rm % % Insert space above the heading. \csname #2headingbreak\endcsname % % Only insert the space after the number if we have a section number. \def\sectionlevel{#2}% \def\temptype{#3}% % \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\thissection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \thissection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\thissection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\thissection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chfplain. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chfplain. \donoderef{#3}% % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) \vskip-\parskip % % This is purely so the last item on the list is a known \penalty > % 10000. This is so \startdefun can avoid allowing breakpoints after % section headings. Otherwise, it would insert a valid breakpoint between: % % @section sec-whatever % @deffn def-whatever \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks \toks0 = {#2}% \toks2 = \expandafter{\lastnode}% \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}% {\the\toks2}{\noexpand\folio}}}% \temp \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \def\thischapter{}% \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 % We can't do this, because then an actual ^ in a section % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % Normal (long) toc. \def\contents{% \startcontents{\putwordTOC}% \openin 1 \jobname.toc \ifeof 1 \else \input \jobname.toc \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \jobname.toc \ifeof 1 \else \input \jobname.toc \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, it should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @tex ... @end tex escapes into raw Tex temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain tex @ character. \envdef\tex{% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \escapechar=`\\ % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing=\comment \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of \def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt \parindent = 0pt \emergencystretch = 0pt % don't try to avoid overfull boxes % @cartouche defines \nonarrowing to inhibit narrowing % at next level down. \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \fi \let\exdent=\nofillexdent } % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it by one command: \def\makedispenv #1#2{ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two synonyms: \def\maketwodispenvs #1#2#3{ \makedispenv{#1}{#3} \makedispenv{#2}{#3} } % @lisp: indented, narrowed, typewriter font; @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvs {lisp}{example}{% \nonfillstart \tt \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenv {display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenv{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill \gobble } \let\Eflushright = \afterenvbreak % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \envdef\quotation{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \let\nonarrowing = \relax \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\undefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % [Knuth] pp. 380,381,391 % Disable Spanish ligatures ?` and !` of \tt font \begingroup \catcode`\`=\active\gdef`{\relax\lq} \endgroup % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \catcode`\`=\active \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % \def\starttabbox{\setbox0=\hbox\bgroup} \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen0=\wd0 % the width so far, or since the previous tab \divide\dimen0 by\tabw \multiply\dimen0 by\tabw % compute previous multiple of \tabw \advance\dimen0 by\tabw % advance to next multiple of \tabw \wd0=\dimen0 \box0 \starttabbox }% } \endgroup \def\setupverbatim{% \nonfillstart \advance\leftskip by -\defbodyindent % Easiest (and conventionally used) font for verbatim \tt \def\par{\leavevmode\egroup\box0\endgraf}% \catcode`\`=\active \tabexpand % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \defargscommonending, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % \ifnum\lastpenalty=10002 \penalty2000 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil \endgraf \nobreak\vskip -\parskip \penalty 10002 % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remainnig is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } %%% Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } %%% Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } %%% Type: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % How we'll format the type name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % (plain.tex says that \dimen1 should be used only as global.) \parshape 2 0in \dimen0 \defargsindent \dimen2 % % Put the type name to the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% return value type \ifx\temp\empty\else \tclose{\temp} \fi #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. Let's try @var for that. \let\var=\ttslanted #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } \def\badparencount{% \errmessage{Unbalanced parentheses in @def}% \global\parencount=0 } \def\badbrackcount{% \errmessage{Unbalanced square braces in @def}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\undefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{% \begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % Undo catcode changes of \startcontents and \doprintindex \catcode`\@=0 \catcode`\\=\other \escapechar=`\@ % ... and \example \spaceisspace % % Append \endinput to make sure that TeX does not see the ending newline. % % I've verified that it is necessary both for e-TeX and for ordinary TeX % --kasal, 29nov03 \scantokens{#1\endinput}% \endgroup } \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? \def\macrolist{} % List of all defined macros in the form % \do\macro1\do\macro2... % Utility routines. % This does \let #1 = #2, except with \csnames. \def\cslet#1#2{% \expandafter\expandafter \expandafter\let \expandafter\expandafter \csname#1\endcsname \csname#2\endcsname} % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \. % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. \def\scanctxt{% \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \catcode`\@=\other } \def\scanargctxt{% \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% \scanctxt \catcode`\\=\other } % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0% \else \expandafter\parsemargdef \argl;% \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% % Add the macroname to \macrolist \toks0 = \expandafter{\macrolist\do}% \xdef\macrolist{\the\toks0 \expandafter\noexpand\csname\the\macname\endcsname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\do\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx#1\relax % remove this \else \noexpand\do \noexpand #1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname #1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.blah for each blah % in the params list, to be ##N where N is the position in that list. % That gets used by \mbodybackslash (above). % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. \def\parsemargdef#1;{\paramno=0\def\paramlist{}% \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1% \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% % This defines the macro itself. There are six cases: recursive and % nonrecursive macros of zero, one, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \fi \fi} \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg) \def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \next} % We want to disable all macros during \shipout so that they are not % expanded by \write. \def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}% \edef\next{\macrolist}\expandafter\endgroup\next} % For \indexnofonts, we need to get rid of all macros, leaving only the % arguments (if present). Of course this is not nearly correct, but it % is the best we can do for now. makeinfo does not expand macros in the % argument to @deffn, which ends up writing an index entry, and texindex % isn't prepared for an index sort entry that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \def\emptyusermacros{\begingroup \def\do##1{\let\noexpand##1=\noexpand\asis}% \edef\next{\macrolist}\expandafter\endgroup\next} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Just make them active and then expand them all to nothing. \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \thissection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \turnoffactive \otherbackslash \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\thissection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \writexrdef{pg}{\folio}% will be written later, during \shipout }% \fi } % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces \def\printedmanual{\ignorespaces #5}% \def\printedrefname{\ignorespaces #3}% \setbox1=\hbox{\printedmanual\unskip}% \setbox0=\hbox{\printedrefname\unskip}% \ifdim \wd0 = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax % Use the node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Use the actual chapter/section title appear inside % the square brackets. Use the real section title if we have it. \ifdim \wd1 > 0pt % It is in another manual, so we don't have it. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf \leavevmode \getfilename{#4}% {\turnoffactive \otherbackslash \ifnum\filenamelength>0 \startlink attr{/Border [0 0 0]}% goto file{\the\filename.pdf} name{#1}% \else \startlink attr{/Border [0 0 0]}% goto name{\pdfmkpgn{#1}}% \fi }% \linkcolor \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \otherbackslash \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd0 = 0pt \refx{#1-snt}% \else \printedrefname \fi % % if the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd1 > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not % insert empty discretionaries after hyphens, which means that it will % not find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, this % is a loss. Therefore, we give the text of the node name again, so it % is as if TeX is seeing it for the first time. \ifdim \wd1 > 0pt \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% \else % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive \otherbackslash % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via a macro so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}% \fi \fi \endlink \endgroup} % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs \message{\linenumber Undefined cross reference `#1'.}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value. % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR#1\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readauxfile \global\havexrefstrue \fi \closein 1 } \def\readauxfile{\begingroup \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count 1=128 \def\loop{% \catcode\count 1=\other \advance\count 1 by 1 \ifnum \count 1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 % \input \jobname.aux \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarily, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\undefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing this stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \nobreak\bigskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \line\bgroup\hss \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \hss \egroup \bigbreak \fi % space after the image \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \thissection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\thissection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies \turnoffactive \otherbackslash \immediate\write\auxfile{@xrdef{\floatlabel-lof}{% \floatident \ifx\thisshortcaption\empty \ifx\thiscaption\empty \else : \thiscaption \fi \else : \thisshortcaption \fi }}% }% \fi % % Space below caption, if we printed anything. \ifx\printedsomething\empty \else \vskip\parskip \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \thissection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % and i18n. % @documentlanguage is usually given very early, just after % @setfilename. If done too late, it may not override everything % properly. Single argument is the language abbreviation. % It would be nice if we could set up a hyphenation file here. % \parseargdef\documentlanguage{% \tex % read txi-??.tex file in plain TeX. % Read the file if it exists. \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \input txi-#1.tex \fi \closein 1 \endgroup } \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? In the current directory should work if nowhere else does.} % @documentencoding should change something in TeX eventually, most % likely, but for now just recognize it. \let\documentencoding = \comment % Page size parameters. % \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be so finicky about underfull hboxes, either. \hbadness = 2000 % Following George Bush, just get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; 3) voffset; % 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8) % physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{46\baselineskip}{6in}% {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.5 (or so) format. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {\voffset}{.25in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{51\baselineskip}{160mm} {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1 \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \catcode`\$=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} \def\normaldollar{$}%$ font-lock fix % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. {\catcode`\\=\active @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} } % \realbackslash is an actual character `\' with catcode other. {\catcode`\\=\other @gdef@realbackslash{\}} % \normalbackslash outputs one backslash in fixed width font. \def\normalbackslash{{\tt\backslashcurfont}} \catcode`\\=\active % Used sometimes to turn off (effectively) the active characters % even after parsing them. @def@turnoffactive{% @let"=@normaldoublequote @let\=@realbackslash @let~=@normaltilde @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let<=@normalless @let>=@normalgreater @let+=@normalplus @let$=@normaldollar %$ font-lock fix @unsepspaces } % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. (Thus, \ is not expandable when this is in % effect.) % @def@normalturnoffactive{@turnoffactive @let\=@normalbackslash} % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\{ in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also back turn on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These look ok in all fonts, so just make them not special. @catcode`@& = @other @catcode`@# = @other @catcode`@% = @other @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore sed-3.62/config_h.in0000644000076600001200000002276510202173635011253 00000000000000/* config_h.in. Generated from configure.ac by autoheader. */ /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_ARGZ_H /* Define to 1 if you have the `bcopy' function. */ #undef HAVE_BCOPY /* Define to 1 if you have the `btowc' function. */ #undef HAVE_BTOWC /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the `fchmod' function. */ #undef HAVE_FCHMOD /* Define to 1 if you have the `fchown' function. */ #undef HAVE_FCHOWN /* Define to 1 if you have the `feof_unlocked' function. */ #undef HAVE_FEOF_UNLOCKED /* Define to 1 if you have the `fgets_unlocked' function. */ #undef HAVE_FGETS_UNLOCKED /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if you have the `getc_unlocked' function. */ #undef HAVE_GETC_UNLOCKED /* Define to 1 if you have the `getegid' function. */ #undef HAVE_GETEGID /* Define to 1 if you have the `geteuid' function. */ #undef HAVE_GETEUID /* Define to 1 if you have the `getgid' function. */ #undef HAVE_GETGID /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `getuid' function. */ #undef HAVE_GETUID /* Define if you have the iconv() function. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_IO_H /* Define to 1 if you have the `isascii' function. */ #undef HAVE_ISASCII /* Define to 1 if you have the `isatty' function. */ #undef HAVE_ISATTY /* Define to 1 if you have the `isblank' function. */ #undef HAVE_ISBLANK /* Define if you have and nl_langinfo(CODESET). */ #undef HAVE_LANGINFO_CODESET /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you support file names longer than 14 characters. */ #undef HAVE_LONG_FILE_NAMES /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if mbrtowc and mbstate_t are properly declared. */ #undef HAVE_MBRTOWC /* Define to 1 if declares mbstate_t. */ #undef HAVE_MBSTATE_T /* Define to 1 if you have the `memchr' function. */ #undef HAVE_MEMCHR /* Define to 1 if you have the `memcmp' function. */ #undef HAVE_MEMCMP /* Define to 1 if you have the `memcpy' function. */ #undef HAVE_MEMCPY /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mempcpy' function. */ #undef HAVE_MEMPCPY /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mkstemp' function. */ #undef HAVE_MKSTEMP /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the `munmap' function. */ #undef HAVE_MUNMAP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NL_TYPES_H /* Define to 1 if libc includes obstacks. */ #undef HAVE_OBSTACK /* Define to 1 if you have the `pathconf' function. */ #undef HAVE_PATHCONF /* Define to 1 if you have the `popen' function. */ #undef HAVE_POPEN /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_STDARG_H /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `stpcpy' function. */ #undef HAVE_STPCPY /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL /* Define to 1 if you have the `strverscmp' function. */ #undef HAVE_STRVERSCMP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the `tsearch' function. */ #undef HAVE_TSEARCH /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if you have the `wcrtomb' function. */ #undef HAVE_WCRTOMB /* Define to 1 if you have the `wcscoll' function. */ #undef HAVE_WCSCOLL /* Define to 1 if you have the header file. */ #undef HAVE_WCTYPE_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if you have the `__argz_count' function. */ #undef HAVE___ARGZ_COUNT /* Define to 1 if you have the `__argz_next' function. */ #undef HAVE___ARGZ_NEXT /* Define to 1 if you have the `__argz_stringify' function. */ #undef HAVE___ARGZ_STRINGIFY /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to the version of GNU sed whose features are supported by this sed. */ #undef SED_FEATURE_VERSION /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if on AIX 3. System headers sometimes define this. We just want to avoid a redefinition error message. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to a type if does not define. */ #undef mbstate_t /* Define to `long' if does not define. */ #undef off_t /* Define to `unsigned' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t sed-3.62/configure0000755000076600007660000116145210202173554011074 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for sed 3.62. # # Report bugs to . # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME='sed' PACKAGE_TARNAME='ssed' PACKAGE_VERSION='3.62' PACKAGE_STRING='sed 3.62' PACKAGE_BUGREPORT='bonzini@gnu.org' ac_unique_file="sed/sed.c" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar SED_FEATURE_VERSION CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE RANLIB ac_ct_RANLIB CPP EGREP HAVE__BOOL ALLOCA LIBOBJS PCREGREP BUILD_HTML_TRUE BUILD_HTML_FALSE TEXI2HTML MAKEINFO_HTML_TRUE MAKEINFO_HTML_FALSE TEXI2HTML_HTML_TRUE TEXI2HTML_HTML_FALSE MKINSTALLDIRS MSGFMT GMSGFMT XGETTEXT MSGMERGE build build_cpu build_vendor build_os host host_cpu host_vendor host_os GLIBC21 LIBICONV LTLIBICONV INTLBISON USE_NLS BUILD_INCLUDED_LIBINTL USE_INCLUDED_LIBINTL CATOBJEXT INTLOBJS DATADIRNAME INSTOBJEXT GENCAT INTL_LIBTOOL_SUFFIX_PREFIX INTLLIBS LIBINTL LTLIBINTL POSUB LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures sed 3.62 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of sed 3.62:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-largefile omit support for large files --enable-pcregrep build the pcregrep test program --enable-html build HTML manual (default=no) --disable-nls do not use Native Language Support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-included-gettext use the GNU gettext library included here --with-libintl-prefix=DIR search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF sed configure 3.62 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by sed $as_me 3.62, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in config $srcdir/config; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in config $srcdir/config" >&5 echo "$as_me: error: cannot find install-sh or install.sh in config $srcdir/config" >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. ac_config_headers="$ac_config_headers config.h:config_h.in" am__api_version="1.9" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='ssed' VERSION='3.62' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' SED_FEATURE_VERSION=4.1 cat >>confdefs.h <<_ACEOF #define SED_FEATURE_VERSION "$SED_FEATURE_VERSION" _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6 rm -f confinc confmf # Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval="$enable_dependency_tracking" fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi cat >>confdefs.h <<\_ACEOF #define _GNU_SOURCE 1 _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep echo "$as_me:$LINENO: checking for AIX" >&5 echo $ECHO_N "checking for AIX... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef _AIX yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 cat >>confdefs.h <<\_ACEOF #define _ALL_SOURCE 1 _ACEOF else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi rm -f conftest* echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "${ac_cv_header_minix_config_h+set}" = set; then echo "$as_me:$LINENO: checking for minix/config.h" >&5 echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6 if test "${ac_cv_header_minix_config_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking minix/config.h usability" >&5 echo $ECHO_N "checking minix/config.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking minix/config.h presence" >&5 echo $ECHO_N "checking minix/config.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------ ## ## Report this to bonzini@gnu.org ## ## ------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for minix/config.h" >&5 echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6 if test "${ac_cv_header_minix_config_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_minix_config_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6 fi if test $ac_cv_header_minix_config_h = yes; then MINIX=yes else MINIX= fi if test "$MINIX" = yes; then cat >>confdefs.h <<\_ACEOF #define _POSIX_SOURCE 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _POSIX_1_SOURCE 2 _ACEOF cat >>confdefs.h <<\_ACEOF #define _MINIX 1 _ACEOF fi echo "$as_me:$LINENO: checking for library containing strerror" >&5 echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6 if test "${ac_cv_search_strerror+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_strerror=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char strerror (); int main () { strerror (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_strerror="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_strerror" = no; then for ac_lib in cposix; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char strerror (); int main () { strerror (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_strerror="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 echo "${ECHO_T}$ac_cv_search_strerror" >&6 if test "$ac_cv_search_strerror" != no; then test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS" fi # Check whether --enable-largefile or --disable-largefile was given. if test "${enable_largefile+set}" = set; then enableval="$enable_largefile" fi; if test "$enable_largefile" != no; then echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5 echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6 if test "${ac_cv_sys_largefile_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext CC="$CC -n32" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sys_largefile_CC=' -n32'; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5 echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6 if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5 echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6 if test "${ac_cv_sys_file_offset_bits+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else while :; do ac_cv_sys_file_offset_bits=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sys_file_offset_bits=64; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext break done fi echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5 echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6 if test "$ac_cv_sys_file_offset_bits" != no; then cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF fi rm -f conftest* echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5 echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6 if test "${ac_cv_sys_large_files+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else while :; do ac_cv_sys_large_files=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sys_large_files=1; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext break done fi echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5 echo "${ECHO_T}$ac_cv_sys_large_files" >&6 if test "$ac_cv_sys_large_files" != no; then cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF fi rm -f conftest* fi echo "$as_me:$LINENO: checking for long file names" >&5 echo $ECHO_N "checking for long file names... $ECHO_C" >&6 if test "${ac_cv_sys_long_file_names+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_sys_long_file_names=yes # Test for long file names in all the places we know might matter: # . the current directory, where building will happen # $prefix/lib where we will be installing things # $exec_prefix/lib likewise # eval it to expand exec_prefix. # $TMPDIR if set, where it might want to write temporary files # if $TMPDIR is not set: # /tmp where it might want to write temporary files # /var/tmp likewise # /usr/tmp likewise if test -n "$TMPDIR" && test -d "$TMPDIR" && test -w "$TMPDIR"; then ac_tmpdirs=$TMPDIR else ac_tmpdirs='/tmp /var/tmp /usr/tmp' fi for ac_dir in . $ac_tmpdirs `eval echo $prefix/lib $exec_prefix/lib` ; do test -d $ac_dir || continue test -w $ac_dir || continue # It is less confusing to not echo anything here. ac_xdir=$ac_dir/cf$$ (umask 077 && mkdir $ac_xdir 2>/dev/null) || continue ac_tf1=$ac_xdir/conftest9012345 ac_tf2=$ac_xdir/conftest9012346 (echo 1 >$ac_tf1) 2>/dev/null (echo 2 >$ac_tf2) 2>/dev/null ac_val=`cat $ac_tf1 2>/dev/null` if test ! -f $ac_tf1 || test "$ac_val" != 1; then ac_cv_sys_long_file_names=no rm -rf $ac_xdir 2>/dev/null break fi rm -rf $ac_xdir 2>/dev/null done fi echo "$as_me:$LINENO: result: $ac_cv_sys_long_file_names" >&5 echo "${ECHO_T}$ac_cv_sys_long_file_names" >&6 if test $ac_cv_sys_long_file_names = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LONG_FILE_NAMES 1 _ACEOF fi echo "$as_me:$LINENO: checking whether -lcP is needed" >&5 echo $ECHO_N "checking whether -lcP is needed... $ECHO_C" >&6 if test "$cross_compiling" = yes; then echo "$as_me:$LINENO: result: assuming no" >&5 echo "${ECHO_T}assuming no" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main() { FILE *fp; int result; errno = 0; fp = fopen ("conftest.c", "r"); if (!fp) return 0; /* error, assume not needed */ result = fflush (fp) == EOF && errno == 0; fclose (fp); return result; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 LIBS="-lcP $LIBS" fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then echo "$as_me:$LINENO: checking for library containing opendir" >&5 echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 if test "${ac_cv_search_opendir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_opendir=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main () { opendir (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_opendir="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_opendir" = no; then for ac_lib in dir; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main () { opendir (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_opendir="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 echo "${ECHO_T}$ac_cv_search_opendir" >&6 if test "$ac_cv_search_opendir" != no; then test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" fi else echo "$as_me:$LINENO: checking for library containing opendir" >&5 echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 if test "${ac_cv_search_opendir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_opendir=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main () { opendir (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_opendir="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_opendir" = no; then for ac_lib in x; do LIBS="-l$ac_lib $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char opendir (); int main () { opendir (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_opendir="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 echo "${ECHO_T}$ac_cv_search_opendir" >&6 if test "$ac_cv_search_opendir" != no; then test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" fi fi for ac_header in io.h limits.h locale.h stdarg.h alloca.h stddef.h errno.h \ wchar.h wctype.h sys/file.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6 if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi echo "$as_me:$LINENO: checking for size_t" >&5 echo $ECHO_N "checking for size_t... $ECHO_C" >&6 if test "${ac_cv_type_size_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((size_t *) 0) return 0; if (sizeof (size_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_size_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 echo "${ECHO_T}$ac_cv_type_size_t" >&6 if test $ac_cv_type_size_t = yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned _ACEOF fi echo "$as_me:$LINENO: checking for ssize_t" >&5 echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6 if test "${ac_cv_type_ssize_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((ssize_t *) 0) return 0; if (sizeof (ssize_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_ssize_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_ssize_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_ssize_t" >&5 echo "${ECHO_T}$ac_cv_type_ssize_t" >&6 if test $ac_cv_type_ssize_t = yes; then : else cat >>confdefs.h <<_ACEOF #define ssize_t int _ACEOF fi echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5 echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6 if test "${ac_cv_header_stdbool_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: false is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) -0.5 == true ? 1 : -1]; bool e = &s; char f[(_Bool) -0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; int main () { return !a + !b + !c + !d + !e + !f + !g + !h + !i; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdbool_h=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdbool_h=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5 echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6 echo "$as_me:$LINENO: checking for _Bool" >&5 echo $ECHO_N "checking for _Bool... $ECHO_C" >&6 if test "${ac_cv_type__Bool+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((_Bool *) 0) return 0; if (sizeof (_Bool)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type__Bool=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type__Bool=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5 echo "${ECHO_T}$ac_cv_type__Bool" >&6 if test $ac_cv_type__Bool = yes; then cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_STDBOOL_H 1 _ACEOF fi if test "$ac_cv_type__Bool" = no; then HAVE__BOOL=0 else HAVE__BOOL=1 fi if test "$ac_cv_header_stdbool_h" = no; then ac_config_files="$ac_config_files lib/stdbool.h:lib/stdbool_.h" fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo "$as_me:$LINENO: checking for working alloca.h" >&5 echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6 if test "${ac_cv_working_alloca_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_working_alloca_h=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_working_alloca_h=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 echo "${ECHO_T}$ac_cv_working_alloca_h" >&6 if test $ac_cv_working_alloca_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_ALLOCA_H 1 _ACEOF fi echo "$as_me:$LINENO: checking for alloca" >&5 echo $ECHO_N "checking for alloca... $ECHO_C" >&6 if test "${ac_cv_func_alloca_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_alloca_works=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_alloca_works=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 echo "${ECHO_T}$ac_cv_func_alloca_works" >&6 if test $ac_cv_func_alloca_works = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_ALLOCA 1 _ACEOF else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=alloca.$ac_objext cat >>confdefs.h <<\_ACEOF #define C_ALLOCA 1 _ACEOF echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6 if test "${ac_cv_os_cray+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #if defined(CRAY) && ! defined(CRAY2) webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 echo "${ECHO_T}$ac_cv_os_cray" >&6 if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6 if test "${ac_cv_c_stack_direction+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_c_stack_direction=0 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int find_stack_direction () { static char *addr = 0; auto char dummy; if (addr == 0) { addr = &dummy; return find_stack_direction (); } else return (&dummy > addr) ? 1 : -1; } int main () { exit (find_stack_direction () < 0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_stack_direction=1 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_c_stack_direction=-1 fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 echo "${ECHO_T}$ac_cv_c_stack_direction" >&6 cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi for ac_func in vprintf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF echo "$as_me:$LINENO: checking for _doprnt" >&5 echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 if test "${ac_cv_func__doprnt+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define _doprnt to an innocuous variant, in case declares _doprnt. For example, HP-UX 11i declares gettimeofday. */ #define _doprnt innocuous__doprnt /* System header to define __stub macros and hopefully few prototypes, which can conflict with char _doprnt (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef _doprnt /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char _doprnt (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub__doprnt) || defined (__stub____doprnt) choke me #else char (*f) () = _doprnt; #endif #ifdef __cplusplus } #endif int main () { return f != _doprnt; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func__doprnt=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func__doprnt=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 echo "${ECHO_T}$ac_cv_func__doprnt" >&6 if test $ac_cv_func__doprnt = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_DOPRNT 1 _ACEOF fi fi done am_getline_needs_run_time_check=no echo "$as_me:$LINENO: checking for getline" >&5 echo $ECHO_N "checking for getline... $ECHO_C" >&6 if test "${ac_cv_func_getline+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define getline to an innocuous variant, in case declares getline. For example, HP-UX 11i declares gettimeofday. */ #define getline innocuous_getline /* System header to define __stub macros and hopefully few prototypes, which can conflict with char getline (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef getline /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char getline (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_getline) || defined (__stub___getline) choke me #else char (*f) () = getline; #endif #ifdef __cplusplus } #endif int main () { return f != getline; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_getline=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_getline=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_getline" >&5 echo "${ECHO_T}$ac_cv_func_getline" >&6 if test $ac_cv_func_getline = yes; then am_getline_needs_run_time_check=yes else am_cv_func_working_getline=no fi if test $am_getline_needs_run_time_check = yes; then echo "$as_me:$LINENO: checking for working getline function" >&5 echo $ECHO_N "checking for working getline function... $ECHO_C" >&6 if test "${am_cv_func_working_getline+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else echo fooN |tr -d '\012'|tr N '\012' > conftest.data if test "$cross_compiling" = yes; then am_cv_func_working_getline=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ # include # include # include int main () { /* Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len; FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; len = getline (&line, &siz, in); exit ((len == 4 && line && strcmp (line, "foo\n") == 0) ? 0 : 1); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then am_cv_func_working_getline=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) am_cv_func_working_getline=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $am_cv_func_working_getline" >&5 echo "${ECHO_T}$am_cv_func_working_getline" >&6 fi if test $am_cv_func_working_getline = no; then case $LIBOBJS in "getline.$ac_objext" | \ *" getline.$ac_objext" | \ "getline.$ac_objext "* | \ *" getline.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS getline.$ac_objext" ;; esac fi echo "$as_me:$LINENO: checking for obstacks" >&5 echo $ECHO_N "checking for obstacks... $ECHO_C" >&6 if test "${ac_cv_func_obstack+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include "obstack.h" int main () { struct obstack *mem; obstack_free(mem,(char *) 0) ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_obstack=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_obstack=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_obstack" >&5 echo "${ECHO_T}$ac_cv_func_obstack" >&6 if test $ac_cv_func_obstack = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_OBSTACK 1 _ACEOF else case $LIBOBJS in "obstack.$ac_objext" | \ *" obstack.$ac_objext" | \ "obstack.$ac_objext "* | \ *" obstack.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS obstack.$ac_objext" ;; esac fi echo "$as_me:$LINENO: checking whether mbrtowc and mbstate_t are properly declared" >&5 echo $ECHO_N "checking whether mbrtowc and mbstate_t are properly declared... $ECHO_C" >&6 if test "${ac_cv_func_mbrtowc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { mbstate_t state; return ! (sizeof state && mbrtowc); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_mbrtowc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_mbrtowc=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_mbrtowc" >&5 echo "${ECHO_T}$ac_cv_func_mbrtowc" >&6 if test $ac_cv_func_mbrtowc = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_MBRTOWC 1 _ACEOF fi echo "$as_me:$LINENO: checking for mbstate_t" >&5 echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 if test "${ac_cv_type_mbstate_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default # include int main () { mbstate_t x; return sizeof x; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_mbstate_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_mbstate_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_mbstate_t" >&5 echo "${ECHO_T}$ac_cv_type_mbstate_t" >&6 if test $ac_cv_type_mbstate_t = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_MBSTATE_T 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define mbstate_t int _ACEOF fi for ac_func in strverscmp do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else case $LIBOBJS in "$ac_func.$ac_objext" | \ *" $ac_func.$ac_objext" | \ "$ac_func.$ac_objext "* | \ *" $ac_func.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;; esac fi done if test $ac_cv_func_strverscmp = no; then : fi for ac_func in memchr memcmp memmove strerror snprintf mkstemp do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else case $LIBOBJS in "$ac_func.$ac_objext" | \ *" $ac_func.$ac_objext" | \ "$ac_func.$ac_objext "* | \ *" $ac_func.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;; esac fi done for ac_func in isatty bcopy bzero isascii memcpy memset strchr strtoul popen \ pathconf isblank fchown fchmod setlocale wcrtomb wcscoll btowc do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Check whether --enable-pcregrep or --disable-pcregrep was given. if test "${enable_pcregrep+set}" = set; then enableval="$enable_pcregrep" PCREGREP=pcregrep else PCREGREP= fi; # Check whether --enable-html or --disable-html was given. if test "${enable_html+set}" = set; then enableval="$enable_html" else enable_html=no fi; if test "x$enable_html" != xno; then BUILD_HTML_TRUE= BUILD_HTML_FALSE='#' else BUILD_HTML_TRUE='#' BUILD_HTML_FALSE= fi : ${TEXI2HTML=texi2html -monolithic} echo "$as_me:$LINENO: checking how to build HTML documentation" >&5 echo $ECHO_N "checking how to build HTML documentation... $ECHO_C" >&6 if eval $am_missing_run makeinfo --help 2>&1 | grep .-html > /dev/null; then echo "$as_me:$LINENO: result: with makeinfo" >&5 echo "${ECHO_T}with makeinfo" >&6 enable_html=makeinfo else if $TEXI2HTML --help 2>&1 | grep monolithic > /dev/null; then echo "$as_me:$LINENO: result: with texi2html" >&5 echo "${ECHO_T}with texi2html" >&6 enable_html=texi2html else echo "$as_me:$LINENO: result: not built" >&5 echo "${ECHO_T}not built" >&6 if test "x$enable_html" != xno; then { { echo "$as_me:$LINENO: error: cannot build HTML documentation" >&5 echo "$as_me: error: cannot build HTML documentation" >&2;} { (exit install makeinfo 4.0 or texi2html); exit install makeinfo 4.0 or texi2html; }; } fi enable_html=no fi fi if test "x$enable_html" = xmakeinfo; then MAKEINFO_HTML_TRUE= MAKEINFO_HTML_FALSE='#' else MAKEINFO_HTML_TRUE='#' MAKEINFO_HTML_FALSE= fi if test "x$enable_html" = xtexi2html; then TEXI2HTML_HTML_TRUE= TEXI2HTML_HTML_FALSE='#' else TEXI2HTML_HTML_TRUE='#' TEXI2HTML_HTML_FALSE= fi MKINSTALLDIRS="$mkdir_p" # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_MSGFMT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then echo "$as_me:$LINENO: result: $MSGFMT" >&5 echo "${ECHO_T}$MSGFMT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_GMSGFMT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then echo "$as_me:$LINENO: result: $GMSGFMT" >&5 echo "${ECHO_T}$GMSGFMT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_XGETTEXT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then echo "$as_me:$LINENO: result: $XGETTEXT" >&5 echo "${ECHO_T}$XGETTEXT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi rm -f messages.po # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_MSGMERGE+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case "$MSGMERGE" in /*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then echo "$as_me:$LINENO: result: $MSGMERGE" >&5 echo "${ECHO_T}$MSGMERGE" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "$GMSGFMT" != ":"; then if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5 echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6 GMSGFMT=":" fi fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5 echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6 XGETTEXT=":" fi rm -f messages.po fi ac_config_commands="$ac_config_commands default-1" # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6 if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_build_alias=$build_alias test -z "$ac_cv_build_alias" && ac_cv_build_alias=`$ac_config_guess` test -z "$ac_cv_build_alias" && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6 if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_host_alias=$host_alias test -z "$ac_cv_host_alias" && ac_cv_host_alias=$ac_cv_build_alias ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking for inline" >&5 echo $ECHO_N "checking for inline... $ECHO_C" >&6 if test "${ac_cv_c_inline+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_inline=$ac_kw; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done fi echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 echo "${ECHO_T}$ac_cv_c_inline" >&6 case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac echo "$as_me:$LINENO: checking for off_t" >&5 echo $ECHO_N "checking for off_t... $ECHO_C" >&6 if test "${ac_cv_type_off_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((off_t *) 0) return 0; if (sizeof (off_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_off_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_off_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 echo "${ECHO_T}$ac_cv_type_off_t" >&6 if test $ac_cv_type_off_t = yes; then : else cat >>confdefs.h <<_ACEOF #define off_t long _ACEOF fi for ac_header in stdlib.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------ ## ## Report this to bonzini@gnu.org ## ## ------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done echo "$as_me:$LINENO: checking for working mmap" >&5 echo $ECHO_N "checking for working mmap... $ECHO_C" >&6 if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_mmap_fixed_mapped=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !STDC_HEADERS && !HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #if !HAVE_GETPAGESIZE /* Assume that all systems that can run configure have sys/param.h. */ # if !HAVE_SYS_PARAM_H # define HAVE_SYS_PARAM_H 1 # endif # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # if HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; int i, pagesize; int fd; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) exit (1); for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) exit (1); if (write (fd, data, pagesize) != pagesize) exit (1); close (fd); /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) exit (1); data2 = (char *) malloc (2 * pagesize); if (!data2) exit (1); data2 += (pagesize - ((long) data2 & (pagesize - 1))) & (pagesize - 1); if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) exit (1); for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) exit (1); /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) exit (1); if (read (fd, data3, pagesize) != pagesize) exit (1); for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) exit (1); close (fd); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_mmap_fixed_mapped=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6 if test $ac_cv_func_mmap_fixed_mapped = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_MMAP 1 _ACEOF fi rm -f conftest.mmap echo "$as_me:$LINENO: checking whether we are using the GNU C Library 2.1 or newer" >&5 echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6 if test "${ac_cv_gnu_library_2_1+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1; then ac_cv_gnu_library_2_1=yes else ac_cv_gnu_library_2_1=no fi rm -f conftest* fi echo "$as_me:$LINENO: result: $ac_cv_gnu_library_2_1" >&5 echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6 GLIBC21="$ac_cv_gnu_library_2_1" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by GCC" >&5 echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${acl_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then test "$with_gnu_ld" != no && break else test "$with_gnu_ld" != yes && break fi fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then echo "$as_me:$LINENO: result: $LD" >&5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${acl_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. if $LD -v 2>&1 &5; then acl_cv_prog_gnu_ld=yes else acl_cv_prog_gnu_ld=no fi fi echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5 echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6 with_gnu_ld=$acl_cv_prog_gnu_ld echo "$as_me:$LINENO: checking for shared library run path origin" >&5 echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6 if test "${acl_cv_rpath+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 echo "${ECHO_T}$acl_cv_rpath" >&6 wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix or --without-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then withval="$with_libiconv_prefix" if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi fi; LIBICONV= LTLIBICONV= INCICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "X$found_dir" = "X/usr/lib"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done echo "$as_me:$LINENO: checking for iconv" >&5 echo $ECHO_N "checking for iconv... $ECHO_C" >&6 if test "${am_cv_func_iconv+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then am_cv_func_iconv=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then am_cv_lib_iconv=yes am_cv_func_iconv=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 echo "${ECHO_T}$am_cv_func_iconv" >&6 if test "$am_cv_func_iconv" = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_ICONV 1 _ACEOF fi if test "$am_cv_lib_iconv" = yes; then echo "$as_me:$LINENO: checking how to link with libiconv" >&5 echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $LIBICONV" >&5 echo "${ECHO_T}$LIBICONV" >&6 else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ stdlib.h string.h unistd.h sys/param.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------ ## ## Report this to bonzini@gnu.org ## ## ------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "$am_cv_func_iconv" = yes; then echo "$as_me:$LINENO: checking for iconv declaration" >&5 echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6 if test "${am_cv_proto_iconv+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then am_cv_proto_iconv_arg1="" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 am_cv_proto_iconv_arg1="const" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` echo "$as_me:$LINENO: result: ${ac_t:- }$am_cv_proto_iconv" >&5 echo "${ECHO_T}${ac_t:- }$am_cv_proto_iconv" >&6 cat >>confdefs.h <<_ACEOF #define ICONV_CONST $am_cv_proto_iconv_arg1 _ACEOF fi echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5 echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6 if test "${am_cv_langinfo_codeset+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { char* cs = nl_langinfo(CODESET); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then am_cv_langinfo_codeset=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 am_cv_langinfo_codeset=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $am_cv_langinfo_codeset" >&5 echo "${ECHO_T}$am_cv_langinfo_codeset" >&6 if test $am_cv_langinfo_codeset = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LANGINFO_CODESET 1 _ACEOF fi if test $ac_cv_header_locale_h = yes; then echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5 echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6 if test "${am_cv_val_LC_MESSAGES+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then am_cv_val_LC_MESSAGES=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 am_cv_val_LC_MESSAGES=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $am_cv_val_LC_MESSAGES" >&5 echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6 if test $am_cv_val_LC_MESSAGES = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LC_MESSAGES 1 _ACEOF fi fi for ac_prog in bison do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_INTLBISON+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$INTLBISON"; then ac_cv_prog_INTLBISON="$INTLBISON" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_INTLBISON="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi INTLBISON=$ac_cv_prog_INTLBISON if test -n "$INTLBISON"; then echo "$as_me:$LINENO: result: $INTLBISON" >&5 echo "${ECHO_T}$INTLBISON" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$INTLBISON" && break done if test -z "$INTLBISON"; then ac_verc_fail=yes else echo "$as_me:$LINENO: checking version of bison" >&5 echo $ECHO_N "checking version of bison... $ECHO_C" >&6 ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac echo "$as_me:$LINENO: result: $ac_prog_version" >&5 echo "${ECHO_T}$ac_prog_version" >&6 fi if test $ac_verc_fail = yes; then INTLBISON=: fi echo "$as_me:$LINENO: checking whether NLS is requested" >&5 echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6 # Check whether --enable-nls or --disable-nls was given. if test "${enable_nls+set}" = set; then enableval="$enable_nls" USE_NLS=$enableval else USE_NLS=yes fi; echo "$as_me:$LINENO: result: $USE_NLS" >&5 echo "${ECHO_T}$USE_NLS" >&6 BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no LIBINTL= LTLIBINTL= POSUB= if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no echo "$as_me:$LINENO: checking whether included gettext is requested" >&5 echo $ECHO_N "checking whether included gettext is requested... $ECHO_C" >&6 # Check whether --with-included-gettext or --without-included-gettext was given. if test "${with_included_gettext+set}" = set; then withval="$with_included_gettext" nls_cv_force_use_gnu_gettext=$withval else nls_cv_force_use_gnu_gettext=no fi; echo "$as_me:$LINENO: result: $nls_cv_force_use_gnu_gettext" >&5 echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6 nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5 echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6 if test "${gt_cv_func_gnugettext2_libc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; int main () { bindtextdomain ("", ""); return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then gt_cv_func_gnugettext2_libc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 gt_cv_func_gnugettext2_libc=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext2_libc" >&5 echo "${ECHO_T}$gt_cv_func_gnugettext2_libc" >&6 if test "$gt_cv_func_gnugettext2_libc" != "yes"; then use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix or --without-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then withval="$with_libintl_prefix" if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi fi; LIBINTL= LTLIBINTL= INCINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "X$found_dir" = "X/usr/lib"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5 echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6 if test "${gt_cv_func_gnugettext2_libintl+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; int main () { bindtextdomain ("", ""); return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then gt_cv_func_gnugettext2_libintl=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 gt_cv_func_gnugettext2_libintl=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$gt_cv_func_gnugettext2_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; int main () { bindtextdomain ("", ""); return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_func_gnugettext2_libintl=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext2_libintl" >&5 echo "${ECHO_T}$gt_cv_func_gnugettext2_libintl" >&6 fi if test "$gt_cv_func_gnugettext2_libc" = "yes" \ || { test "$gt_cv_func_gnugettext2_libintl" = "yes" \ && test "$PACKAGE" != gettext; }; then gt_use_preinstalled_gnugettext=yes fi if test "$gt_use_preinstalled_gnugettext" != "yes"; then nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then INTLOBJS="\$(GETTOBJS)" BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="../intl/libintl.a $LIBICONV" LTLIBINTL="../intl/libintl.a $LTLIBICONV" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then CATOBJEXT=.gmo fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then cat >>confdefs.h <<\_ACEOF #define ENABLE_NLS 1 _ACEOF else USE_NLS=no fi fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext2_libintl" = "yes"; then echo "$as_me:$LINENO: checking how to link with libintl" >&5 echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $LIBINTL" >&5 echo "${ECHO_T}$LIBINTL" >&6 for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi cat >>confdefs.h <<\_ACEOF #define HAVE_GETTEXT 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi POSUB=po fi if test "$PACKAGE" = gettext; then BUILD_INCLUDED_LIBINTL=yes fi nls_cv_header_intl= nls_cv_header_libgt= DATADIRNAME=share INSTOBJEXT=.mo GENCAT=gencat INTL_LIBTOOL_SUFFIX_PREFIX= INTLLIBS="$LIBINTL" ac_config_commands="$ac_config_commands gettext-fix" ac_config_files="$ac_config_files bootstrap.sh" ac_config_files="$ac_config_files Makefile doc/Makefile lib/Makefile sed/Makefile testsuite/Makefile po/Makefile.in intl/Makefile pcre/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${BUILD_HTML_TRUE}" && test -z "${BUILD_HTML_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"BUILD_HTML\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"BUILD_HTML\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${MAKEINFO_HTML_TRUE}" && test -z "${MAKEINFO_HTML_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MAKEINFO_HTML\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MAKEINFO_HTML\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${TEXI2HTML_HTML_TRUE}" && test -z "${TEXI2HTML_HTML_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"TEXI2HTML_HTML\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"TEXI2HTML_HTML\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by sed $as_me 3.62, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ sed config.status 3.62 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS section. # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # Capture the value of obsolete $ALL_LINGUAS because we need it to compute # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it # from automake. eval 'ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "lib/stdbool.h" ) CONFIG_FILES="$CONFIG_FILES lib/stdbool.h:lib/stdbool_.h" ;; "bootstrap.sh" ) CONFIG_FILES="$CONFIG_FILES bootstrap.sh" ;; "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "lib/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "sed/Makefile" ) CONFIG_FILES="$CONFIG_FILES sed/Makefile" ;; "testsuite/Makefile" ) CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "intl/Makefile" ) CONFIG_FILES="$CONFIG_FILES intl/Makefile" ;; "pcre/Makefile" ) CONFIG_FILES="$CONFIG_FILES pcre/Makefile" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "gettext-fix" ) CONFIG_COMMANDS="$CONFIG_COMMANDS gettext-fix" ;; "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config_h.in" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@AMTAR@,$AMTAR,;t t s,@am__tar@,$am__tar,;t t s,@am__untar@,$am__untar,;t t s,@SED_FEATURE_VERSION@,$SED_FEATURE_VERSION,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@DEPDIR@,$DEPDIR,;t t s,@am__include@,$am__include,;t t s,@am__quote@,$am__quote,;t t s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t s,@CCDEPMODE@,$CCDEPMODE,;t t s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@CPP@,$CPP,;t t s,@EGREP@,$EGREP,;t t s,@HAVE__BOOL@,$HAVE__BOOL,;t t s,@ALLOCA@,$ALLOCA,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@PCREGREP@,$PCREGREP,;t t s,@BUILD_HTML_TRUE@,$BUILD_HTML_TRUE,;t t s,@BUILD_HTML_FALSE@,$BUILD_HTML_FALSE,;t t s,@TEXI2HTML@,$TEXI2HTML,;t t s,@MAKEINFO_HTML_TRUE@,$MAKEINFO_HTML_TRUE,;t t s,@MAKEINFO_HTML_FALSE@,$MAKEINFO_HTML_FALSE,;t t s,@TEXI2HTML_HTML_TRUE@,$TEXI2HTML_HTML_TRUE,;t t s,@TEXI2HTML_HTML_FALSE@,$TEXI2HTML_HTML_FALSE,;t t s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t s,@MSGFMT@,$MSGFMT,;t t s,@GMSGFMT@,$GMSGFMT,;t t s,@XGETTEXT@,$XGETTEXT,;t t s,@MSGMERGE@,$MSGMERGE,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t s,@build_os@,$build_os,;t t s,@host@,$host,;t t s,@host_cpu@,$host_cpu,;t t s,@host_vendor@,$host_vendor,;t t s,@host_os@,$host_os,;t t s,@GLIBC21@,$GLIBC21,;t t s,@LIBICONV@,$LIBICONV,;t t s,@LTLIBICONV@,$LTLIBICONV,;t t s,@INTLBISON@,$INTLBISON,;t t s,@USE_NLS@,$USE_NLS,;t t s,@BUILD_INCLUDED_LIBINTL@,$BUILD_INCLUDED_LIBINTL,;t t s,@USE_INCLUDED_LIBINTL@,$USE_INCLUDED_LIBINTL,;t t s,@CATOBJEXT@,$CATOBJEXT,;t t s,@INTLOBJS@,$INTLOBJS,;t t s,@DATADIRNAME@,$DATADIRNAME,;t t s,@INSTOBJEXT@,$INSTOBJEXT,;t t s,@GENCAT@,$GENCAT,;t t s,@INTL_LIBTOOL_SUFFIX_PREFIX@,$INTL_LIBTOOL_SUFFIX_PREFIX,;t t s,@INTLLIBS@,$INTLLIBS,;t t s,@LIBINTL@,$LIBINTL,;t t s,@LTLIBINTL@,$LTLIBINTL,;t t s,@POSUB@,$POSUB,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi # Run the commands associated with the file. case $ac_file in bootstrap.sh ) chmod +x bootstrap.sh ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_HEADER section. # # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } # Do quote $f, to prevent DOS paths from being IFS'd. echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. sed 's/[ ]*$//' $ac_file_inputs >$tmp/in _ACEOF # Transform confdefs.h into two sed scripts, `conftest.defines' and # `conftest.undefs', that substitutes the proper values into # config.h.in to produce config.h. The first handles `#define' # templates, and the second `#undef' templates. # And first: Protect against being on the right side of a sed subst in # config.status. Protect against being in an unquoted here document # in config.status. rm -f conftest.defines conftest.undefs # Using a here document instead of a string reduces the quoting nightmare. # Putting comments in sed scripts is not portable. # # `end' is used to avoid that the second main sed command (meant for # 0-ary CPP macros) applies to n-ary macro definitions. # See the Autoconf documentation for `clear'. cat >confdef2sed.sed <<\_ACEOF s/[\\&,]/\\&/g s,[\\$`],\\&,g t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp t end s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp : end _ACEOF # If some macros were called several times there might be several times # the same #defines, which is useless. Nevertheless, we may not want to # sort them, since we want the *last* AC-DEFINE to be honored. uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs rm -f confdef2sed.sed # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >>conftest.undefs <<\_ACEOF s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, _ACEOF # Break up conftest.defines because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS echo ' :' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.defines >/dev/null do # Write a limited-size here document to $tmp/defines.sed. echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#define' lines. echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/defines.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines echo ' fi # grep' >>$CONFIG_STATUS echo >>$CONFIG_STATUS # Break up conftest.undefs because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #undef templates' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.undefs >/dev/null do # Write a limited-size here document to $tmp/undefs.sed. echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#undef' echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/undefs.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail rm -f conftest.undefs mv conftest.tail conftest.undefs done rm -f conftest.undefs cat >>$CONFIG_STATUS <<\_ACEOF # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then echo "/* Generated by configure. */" >$tmp/config.h else echo "/* $ac_file. Generated by configure. */" >$tmp/config.h fi cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then if diff $ac_file $tmp/config.h >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } rm -f $ac_file mv $tmp/config.h $ac_file fi else cat $tmp/config.h rm -f $tmp/config.h fi # Compute $ac_file's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $ac_file | $ac_file:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X$ac_file : 'X\(//\)[^/]' \| \ X$ac_file : 'X\(//\)$' \| \ X$ac_file : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X$ac_file | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'`/stamp-h$_am_stamp_count done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_dest" : 'X\(//\)[^/]' \| \ X"$ac_dest" : 'X\(//\)$' \| \ X"$ac_dest" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`(dirname "$mf") 2>/dev/null || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`(dirname "$file") 2>/dev/null || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p $dirpart/$fdir else as_dir=$dirpart/$fdir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; default-1 ) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' fi case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= GMOFILES= UPDATEPOFILES= DUMMYPOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; gettext-fix ) sed -e 's/^mkinstalldirs *=.*/mkinstalldirs=$(MKINSTALLDIRS)/' \ intl/Makefile > intl/Makefile.tmp mv intl/Makefile.tmp intl/Makefile sed -e 's/^mkinstalldirs *=.*/mkinstalldirs=$(MKINSTALLDIRS)/' \ po/Makefile > po/Makefile.tmp mv po/Makefile.tmp po/Makefile ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi sed-3.62/configure.ac0000644000076600007660000000651110202173272011441 00000000000000dnl Process this file with -*- autoconf -*- to produce a configure script. AC_INIT(sed, 3.62, bonzini@gnu.org, ssed) AC_CONFIG_AUX_DIR(config) AC_CONFIG_SRCDIR([sed/sed.c]) AM_CONFIG_HEADER(config.h:config_h.in) AC_PREREQ(2.59) AM_INIT_AUTOMAKE SED_FEATURE_VERSION=4.1 AC_DEFINE_UNQUOTED(SED_FEATURE_VERSION, "$SED_FEATURE_VERSION", [Define to the version of GNU sed whose features are supported by this sed.]) AC_SUBST(SED_FEATURE_VERSION) AC_PROG_CC AC_PROG_RANLIB AC_GNU_SOURCE AC_AIX AC_MINIX AC_ISC_POSIX AC_SYS_LARGEFILE AC_SYS_LONG_FILE_NAMES AC_MSG_CHECKING([whether -lcP is needed]) AC_TRY_RUN([ #include #include int main() { FILE *fp; int result; errno = 0; fp = fopen ("conftest.c", "r"); if (!fp) return 0; /* error, assume not needed */ result = fflush (fp) == EOF && errno == 0; fclose (fp); return result; }], [AC_MSG_RESULT(no)], [AC_MSG_RESULT(yes) LIBS="-lcP $LIBS"], [AC_MSG_RESULT([assuming no]) ]) AC_HEADER_DIRENT AC_CHECK_HEADERS(io.h limits.h locale.h stdarg.h alloca.h stddef.h errno.h \ wchar.h wctype.h sys/file.h, [], [], [AC_INCLUDES_DEFAULT]) AC_C_CONST AC_TYPE_SIZE_T AC_CHECK_TYPE(ssize_t, int) AC_HEADER_STDBOOL if test "$ac_cv_type__Bool" = no; then HAVE__BOOL=0 else HAVE__BOOL=1 fi AC_SUBST(HAVE__BOOL) if test "$ac_cv_header_stdbool_h" = no; then AC_CONFIG_FILES(lib/stdbool.h:lib/stdbool_.h) fi AC_FUNC_ALLOCA AC_FUNC_VPRINTF AM_FUNC_GETLINE AC_FUNC_OBSTACK AC_FUNC_MBRTOWC AC_TYPE_MBSTATE_T gl_FUNC_STRVERSCMP AC_REPLACE_FUNCS(memchr memcmp memmove strerror snprintf mkstemp) AC_CHECK_FUNCS(isatty bcopy bzero isascii memcpy memset strchr strtoul popen \ pathconf isblank fchown fchmod setlocale wcrtomb wcscoll btowc) AC_ARG_ENABLE(pcregrep, [ --enable-pcregrep build the pcregrep test program], PCREGREP=pcregrep, PCREGREP=) AC_SUBST(PCREGREP) AC_ARG_ENABLE(html, [ --enable-html build HTML manual (default=no)], , enable_html=no) AM_CONDITIONAL(BUILD_HTML, test "x$enable_html" != xno) : ${TEXI2HTML=texi2html -monolithic} AC_SUBST(TEXI2HTML) AC_MSG_CHECKING(how to build HTML documentation) if eval $am_missing_run makeinfo --help 2>&1 | grep .-html > /dev/null; then AC_MSG_RESULT(with makeinfo) enable_html=makeinfo else if $TEXI2HTML --help 2>&1 | grep monolithic > /dev/null; then AC_MSG_RESULT(with texi2html) enable_html=texi2html else AC_MSG_RESULT(not built) if test "x$enable_html" != xno; then AC_MSG_ERROR(cannot build HTML documentation, install makeinfo 4.0 or texi2html) fi enable_html=no fi fi AM_CONDITIONAL(MAKEINFO_HTML, test "x$enable_html" = xmakeinfo) AM_CONDITIONAL(TEXI2HTML_HTML, test "x$enable_html" = xtexi2html) AC_DEFUN([AM_MKINSTALLDIRS], [MKINSTALLDIRS="$mkdir_p" AC_SUBST(MKINSTALLDIRS)]) AM_GNU_GETTEXT_VERSION(0.14) AM_GNU_GETTEXT(no-libtool, need-ngettext, ../intl) AC_CONFIG_COMMANDS([gettext-fix], [ sed -e 's/^mkinstalldirs *=.*/mkinstalldirs=$(MKINSTALLDIRS)/' \ intl/Makefile > intl/Makefile.tmp mv intl/Makefile.tmp intl/Makefile sed -e 's/^mkinstalldirs *=.*/mkinstalldirs=$(MKINSTALLDIRS)/' \ po/Makefile > po/Makefile.tmp mv po/Makefile.tmp po/Makefile]) AC_CONFIG_FILES([bootstrap.sh], chmod +x bootstrap.sh) AC_CONFIG_FILES([Makefile doc/Makefile \ lib/Makefile sed/Makefile testsuite/Makefile \ po/Makefile.in intl/Makefile pcre/Makefile]) AC_OUTPUT sed-3.62/doc/0000777000076600007660000000000010202633245010002 500000000000000sed-3.62/doc/Makefile.am0000644000076600007660000000272210202143516011752 00000000000000## Process this file with automake to produce Makefile.in info_TEXINFOS = sed.texi sed_TEXINFOS = config.texi version.texi dist_man_MANS = sed.1 dist_noinst_DATA = sed.x sed-in.texi pcre.html dist_noinst_SCRIPTS = groupify.sed CLEANFILES = sed.html TEXI2DVI = $(top_srcdir)/config/texi2dvi --expand HELP2MAN = $(top_srcdir)/config/help2man SED = $(top_builddir)/sed/sed # To produce better quality output, in the example sed # scripts we group comments with lines following them; # since mantaining the "@group...@end group" manually # is a burden, we do this automatically $(srcdir)/sed.texi: sed-in.texi $(srcdir)/groupify.sed sed -nf $(srcdir)/groupify.sed \ < $(srcdir)/sed-in.texi > $(srcdir)/sed.texi sed.1: $(top_srcdir)/sed/sed.c $(top_srcdir)/configure.ac $(srcdir)/sed.x $(HELP2MAN) -p sed --include $(srcdir)/sed.x $(SED) > $(srcdir)/sed.1 dist-hook: touch $(distdir)/sed.1 # This rule is used if --enable-html is passed if BUILD_HTML docdir = $(datadir)/doc doc_DATA = sed.html all: html html: sed.html .PHONY: html endif # Having a dependancy on sed.info automatically makes # sed.html dependant on sed.texi and all the included # sources if MAKEINFO_HTML sed.html: sed.texi sed.info builddir=`pwd` && cd $(srcdir) && \ $(MAKEINFO) --html --no-split -o $$builddir/sed.html sed.texi endif # These rules are used together with TEXI2HTML if TEXI2HTML_HTML sed.html: sed.texi sed.info cp $(srcdir)/*.texi . && \ $(TEXI2HTML) sed.texi && \ rn *.texi endif sed-3.62/doc/Makefile.in0000644000076600007660000004723210202173546011776 00000000000000# Makefile.in generated by automake 1.9.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc DIST_COMMON = $(dist_man_MANS) $(dist_noinst_DATA) \ $(dist_noinst_SCRIPTS) $(sed_TEXINFOS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/stamp-vti \ $(srcdir)/version.texi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/codeset.m4 \ $(top_srcdir)/config/getline.m4 \ $(top_srcdir)/config/gettext-ver.m4 \ $(top_srcdir)/config/gettext.m4 \ $(top_srcdir)/config/glibc21.m4 $(top_srcdir)/config/iconv.m4 \ $(top_srcdir)/config/lcmessage.m4 \ $(top_srcdir)/config/lib-ld.m4 \ $(top_srcdir)/config/lib-link.m4 \ $(top_srcdir)/config/lib-prefix.m4 \ $(top_srcdir)/config/progtest.m4 \ $(top_srcdir)/config/stdbool.m4 \ $(top_srcdir)/config/strverscmp.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SCRIPTS = $(dist_noinst_SCRIPTS) SOURCES = DIST_SOURCES = INFO_DEPS = $(srcdir)/sed.info TEXINFO_TEX = $(top_srcdir)/config/texinfo.tex am__TEXINFO_TEX_DIR = $(top_srcdir)/config DVIS = sed.dvi PDFS = sed.pdf PSS = sed.ps HTMLS = sed.html TEXINFOS = sed.texi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) DVIPS = dvips am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(docdir)" man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man_MANS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; docDATA_INSTALL = $(INSTALL_DATA) DATA = $(dist_noinst_DATA) $(doc_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HTML_FALSE = @BUILD_HTML_FALSE@ BUILD_HTML_TRUE = @BUILD_HTML_TRUE@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ HAVE__BOOL = @HAVE__BOOL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKEINFO_HTML_FALSE = @MAKEINFO_HTML_FALSE@ MAKEINFO_HTML_TRUE = @MAKEINFO_HTML_TRUE@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCREGREP = @PCREGREP@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED_FEATURE_VERSION = @SED_FEATURE_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TEXI2HTML = @TEXI2HTML@ TEXI2HTML_HTML_FALSE = @TEXI2HTML_HTML_FALSE@ TEXI2HTML_HTML_TRUE = @TEXI2HTML_HTML_TRUE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ info_TEXINFOS = sed.texi sed_TEXINFOS = config.texi version.texi dist_man_MANS = sed.1 dist_noinst_DATA = sed.x sed-in.texi pcre.html dist_noinst_SCRIPTS = groupify.sed CLEANFILES = sed.html TEXI2DVI = $(top_srcdir)/config/texi2dvi --expand HELP2MAN = $(top_srcdir)/config/help2man SED = $(top_builddir)/sed/sed # This rule is used if --enable-html is passed @BUILD_HTML_TRUE@docdir = $(datadir)/doc @BUILD_HTML_TRUE@doc_DATA = sed.html all: all-am .SUFFIXES: .SUFFIXES: .dvi .html .info .pdf .ps .texi $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits doc/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnits doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh .texi.info: restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && cd $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $<; \ then \ rc=0; \ cd $(srcdir); \ else \ rc=$$?; \ cd $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $< .texi.pdf: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $< .texi.html: rm -rf $(@:.html=.htp) if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@; \ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ else \ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ exit 1; \ fi $(srcdir)/sed.info: sed.texi $(srcdir)/version.texi $(sed_TEXINFOS) sed.dvi: sed.texi $(srcdir)/version.texi $(sed_TEXINFOS) sed.pdf: sed.texi $(srcdir)/version.texi $(sed_TEXINFOS) @MAKEINFO_HTML_FALSE@@TEXI2HTML_HTML_FALSE@sed.html: sed.texi $(srcdir)/version.texi $(sed_TEXINFOS) $(srcdir)/version.texi: $(srcdir)/stamp-vti $(srcdir)/stamp-vti: sed.texi $(top_srcdir)/configure @(dir=.; test -f ./sed.texi || dir=$(srcdir); \ set `$(SHELL) $(top_srcdir)/config/mdate-sh $$dir/sed.texi`; \ echo "@set UPDATED $$1 $$2 $$3"; \ echo "@set UPDATED-MONTH $$2 $$3"; \ echo "@set EDITION $(VERSION)"; \ echo "@set VERSION $(VERSION)") > vti.tmp @cmp -s vti.tmp $(srcdir)/version.texi \ || (echo "Updating $(srcdir)/version.texi"; \ cp vti.tmp $(srcdir)/version.texi) -@rm -f vti.tmp @cp $(srcdir)/version.texi $@ mostlyclean-vti: -rm -f vti.tmp maintainer-clean-vti: -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi .dvi.ps: $(DVIPS) -o $@ $< uninstall-info-am: $(PRE_UNINSTALL) @if (install-info --version && \ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ done; \ else :; fi @$(NORMAL_UNINSTALL) @list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ (if cd "$(DESTDIR)$(infodir)"; then \ echo " rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9])"; \ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ else :; fi); \ done dist-info: $(INFO_DEPS) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for base in $$list; do \ case $$base in \ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$base; then d=.; else d=$(srcdir); fi; \ for file in $$d/$$base*; do \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f $(distdir)/$$relfile || \ cp -p $$file $(distdir)/$$relfile; \ done; \ done mostlyclean-aminfo: -rm -rf sed.aux sed.cp sed.cps sed.fn sed.fns sed.ky sed.log sed.op sed.pg \ sed.tmp sed.toc sed.tp sed.vr sed.vrs sed.dvi sed.pdf sed.ps \ sed.html maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) test -z "$(docdir)" || $(mkdir_p) "$(DESTDIR)$(docdir)" @list='$(doc_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(docDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docdir)/$$f'"; \ $(docDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docdir)/$$f"; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(docdir)/$$f'"; \ rm -f "$(DESTDIR)$(docdir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info dist-hook check-am: all-am check: check-am all-am: Makefile $(INFO_DEPS) $(SCRIPTS) $(MANS) $(DATA) installdirs: for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: $(DVIS) @BUILD_HTML_FALSE@html: html-am html-am: $(HTMLS) info: info-am info-am: $(INFO_DEPS) install-data-am: install-docDATA install-info-am install-man install-exec-am: install-info: install-info-am install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) test -z "$(infodir)" || $(mkdir_p) "$(DESTDIR)$(infodir)" @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ if test -f $$ifile; then \ relfile=`echo "$$ifile" | sed 's|^.*/||'`; \ echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \ $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \ else : ; fi; \ done; \ done @$(POST_INSTALL) @if (install-info --version && \ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ done; \ else : ; fi install-man: install-man1 installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-aminfo \ maintainer-clean-generic maintainer-clean-vti mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-aminfo mostlyclean-generic mostlyclean-vti pdf: pdf-am pdf-am: $(PDFS) ps: ps-am ps-am: $(PSS) uninstall-am: uninstall-docDATA uninstall-info-am uninstall-man uninstall-man: uninstall-man1 .PHONY: all all-am check check-am clean clean-generic dist-hook \ dist-info distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-docDATA install-exec install-exec-am \ install-info install-info-am install-man install-man1 \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-aminfo \ maintainer-clean-generic maintainer-clean-vti mostlyclean \ mostlyclean-aminfo mostlyclean-generic mostlyclean-vti pdf \ pdf-am ps ps-am uninstall uninstall-am uninstall-docDATA \ uninstall-info-am uninstall-man uninstall-man1 # To produce better quality output, in the example sed # scripts we group comments with lines following them; # since mantaining the "@group...@end group" manually # is a burden, we do this automatically $(srcdir)/sed.texi: sed-in.texi $(srcdir)/groupify.sed sed -nf $(srcdir)/groupify.sed \ < $(srcdir)/sed-in.texi > $(srcdir)/sed.texi sed.1: $(top_srcdir)/sed/sed.c $(top_srcdir)/configure.ac $(srcdir)/sed.x $(HELP2MAN) -p sed --include $(srcdir)/sed.x $(SED) > $(srcdir)/sed.1 dist-hook: touch $(distdir)/sed.1 @BUILD_HTML_TRUE@all: html @BUILD_HTML_TRUE@html: sed.html @BUILD_HTML_TRUE@.PHONY: html # Having a dependancy on sed.info automatically makes # sed.html dependant on sed.texi and all the included # sources @MAKEINFO_HTML_TRUE@sed.html: sed.texi sed.info @MAKEINFO_HTML_TRUE@ builddir=`pwd` && cd $(srcdir) && \ @MAKEINFO_HTML_TRUE@ $(MAKEINFO) --html --no-split -o $$builddir/sed.html sed.texi # These rules are used together with TEXI2HTML @TEXI2HTML_HTML_TRUE@sed.html: sed.texi sed.info @TEXI2HTML_HTML_TRUE@ cp $(srcdir)/*.texi . && \ @TEXI2HTML_HTML_TRUE@ $(TEXI2HTML) sed.texi && \ @TEXI2HTML_HTML_TRUE@ rn *.texi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: sed-3.62/doc/config.texi0000644000076600007660000000030410143133571012054 00000000000000@dircategory Text creation and manipulation @direntry * sed: (sed). Stream EDitor. @end direntry @set PERL @set SSEDEXT @acronym{ssed} extensions @set SSED @command{super-sed} sed-3.62/doc/groupify.sed0000755000076600007660000000205610143133571012266 00000000000000#! /bin/sed -nf # Script to add @group...@end group tags to sed.texi.in # so that comments are not separated from the instructions # that they refer to. # Step 1: search for the conventional "@c start----" comment 1a\ @c Do not edit this file!! It is automatically generated from sed-in.texi. p /^@c start-*$/! b # Step 2: loop until we find a @ command :a n p /^@/! ba # Step 3: process everything until a "@end" command # Step 3.1: Print the blank lines before the group. If we reach the "@end", # we go back to step 1. :b n /^@end/ { p b } /^[ ]*$/ { p bb } # Step 3.2: Add to hold space every line until an empty one or "@end" h :c n /^@end example/! { /^[ ]*$/! { H bc } } # Step 3.3: Working in hold space, add @group...@end group if there are # at least two lines. Then print the lines we processed and # switch back to pattern space. x /\n/ { s/.*/@group\ &\ @end group/ } p # Step 3.4: Switch back to pattern space, print the first blank line # and possibly go back to step 3.1 x p /^@end/ !bb sed-3.62/doc/pcre.html0000644000076600007660000007510010143133571011541 00000000000000 pcre specification

pcre specification

  • NAME

    pcre - Perl-compatible regular expressions.

  • SYNOPSIS

    #include <pcre.h>

    pcre *pcre_compile(const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr);

    pcre_extra *pcre_study(const pcre *code, int options, const char **errptr);

    int pcre_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize);

    int pcre_copy_substring(const char *subject, int *ovector, int stringcount, int stringnumber, char *buffer, int buffersize);

    int pcre_get_substring(const char *subject, int *ovector, int stringcount, int stringnumber, const char **stringptr);

    int pcre_get_substring_list(const char *subject, int *ovector, int stringcount, const char ***listptr);

    void pcre_free_substring(const char *stringptr);

    void pcre_free_substring_list(const char **stringptr);

    const unsigned char *pcre_maketables(void);

    int pcre_info(const pcre *code, const pcre_extra *extra, int what, void *where);

    void *(*pcre_malloc)(size_t);

    void (*pcre_free)(void *);

  • DESCRIPTION

    The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5, with just a few differences (see below). The current implementation corresponds to Perl 5.005, with some additional features from later versions. This includes some experimental, incomplete support for UTF-8 encoded strings. Details of exactly what is and what is not supported are given below.

    PCRE has its own native API, which is described in this document. There is also a set of wrapper functions that correspond to the POSIX regular expression API. These are described in the pcreposix documentation.

    The native API function prototypes are defined in the header file pcre.h, and on Unix systems the library itself is called libpcre.a, so can be accessed by adding -lpcre to the command for linking an application which calls it. The header file defines the macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers for the library. Applications can use these to include support for different releases.

    The functions pcre_compile(), pcre_study(), and pcre_exec() are used for compiling and matching regular expressions.

    The functions pcre_copy_substring(), pcre_get_substring(), and pcre_get_substring_list() are convenience functions for extracting captured substrings from a matched subject string; pcre_free_substring() and pcre_free_substring_list() are also provided, to free the memory used for extracted strings.

    The function pcre_maketables() is used (optionally) to build a set of character tables in the current locale for passing to pcre_compile().

    The function pcre_info() is used to find out information about a compiled pattern.

    The global variables pcre_malloc and pcre_free initially contain the entry points of the standard malloc() and free() functions respectively. PCRE calls the memory management functions via these variables, so a calling program can replace them if it wishes to intercept the calls. This should be done before calling any PCRE functions.

  • MULTI-THREADING

    The PCRE functions can be used in multi-threading applications, with the proviso that the memory management functions pointed to by pcre_malloc and pcre_free are shared by all threads.

    The compiled form of a regular expression is not altered during matching, so the same compiled pattern can safely be used by several threads at once.

  • COMPILING A PATTERN

    The function pcre_compile() is called to compile a pattern into an internal form. The pattern is a C string terminated by a binary zero, and is passed in the argument pattern. A pointer to a single block of memory that is obtained via pcre_malloc is returned. This contains the compiled code and related data. The pcre type is defined for this for convenience, but in fact pcre is just a typedef for void, since the contents of the block are not externally defined. It is up to the caller to free the memory when it is no longer required.

    The size of a compiled pattern is roughly proportional to the length of the pattern string, except that each character class (other than those containing just a single character, negated or not) requires 33 bytes, and repeat quantifiers with a minimum greater than one or a bounded maximum cause the relevant portions of the compiled pattern to be replicated.

    The options argument contains independent bits that affect the compilation. It should be zero if no options are required. Some of the options, in particular, those that are compatible with Perl, can also be set and unset from within the pattern (see the detailed description of regular expressions below). For these options, the contents of the options argument specifies their initial settings at the start of compilation and execution. The PCRE_ANCHORED option can be set at the time of matching as well as at compile time.

    If errptr is NULL, pcre_compile() returns NULL immediately. Otherwise, if compilation of a pattern fails, pcre_compile() returns NULL, and sets the variable pointed to by errptr to point to a textual error message. The offset from the start of the pattern to the character where the error was discovered is placed in the variable pointed to by erroffset, which must not be NULL. If it is, an immediate error is given.

    If the final argument, tableptr, is NULL, PCRE uses a default set of character tables which are built when it is compiled, using the default C locale. Otherwise, tableptr must be the result of a call to pcre_maketables(). See the section on locale support below.

    The following option bits are defined in the header file:

      PCRE_ANCHORED
    

    If this bit is set, the pattern is forced to be "anchored", that is, it is constrained to match only at the start of the string which is being searched (the "subject string"). This effect can also be achieved by appropriate constructs in the pattern itself, which is the only way to do it in Perl.

      PCRE_CASELESS
    

    If this bit is set, letters in the pattern match both upper and lower case letters. It is equivalent to Perl's /i option.

      PCRE_DOLLAR_ENDONLY
    

    If this bit is set, a dollar metacharacter in the pattern matches only at the end of the subject string. Without this option, a dollar also matches immediately before the final character if it is a newline (but not before any other newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. There is no equivalent to this option in Perl.

      PCRE_DOTALL
    

    If this bit is set, a dot metacharater in the pattern matches all characters, including newlines. Without it, newlines are excluded. This option is equivalent to Perl's /s option. A negative class such as [^a] always matches a newline character, independent of the setting of this option.

      PCRE_EXTENDED
    

    If this bit is set, whitespace data characters in the pattern are totally ignored except when escaped or inside a character class, and characters between an unescaped # outside a character class and the next newline character, inclusive, are also ignored. This is equivalent to Perl's /x option, and makes it possible to include comments inside complicated patterns. Note, however, that this applies only to data characters. Whitespace characters may never appear within special character sequences in a pattern, for example within the sequence (?( which introduces a conditional subpattern.

      PCRE_EXTRA
    

    This option was invented in order to turn on additional functionality of PCRE that is incompatible with Perl, but it is currently of very little use. When set, any backslash in a pattern that is followed by a letter that has no special meaning causes an error, thus reserving these combinations for future expansion. By default, as in Perl, a backslash followed by a letter with no special meaning is treated as a literal. There are at present no other features controlled by this option. It can also be set by a (?X) option setting within a pattern.

      PCRE_MULTILINE
    

    By default, PCRE treats the subject string as consisting of a single "line" of characters (even if it actually contains several newlines). The "start of line" metacharacter (^) matches only at the start of the string, while the "end of line" metacharacter ($) matches only at the end of the string, or before a terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as Perl.

    When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs match immediately following or immediately before any newline in the subject string, respectively, as well as at the very start and end. This is equivalent to Perl's /m option. If there are no "\n" characters in a subject string, or no occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect.

      PCRE_UNGREEDY
    

    This option inverts the "greediness" of the quantifiers so that they are not greedy by default, but become greedy if followed by "?". It is not compatible with Perl. It can also be set by a (?U) option setting within the pattern.

      PCRE_UTF8
    

    This option causes PCRE to regard both the pattern and the subject as strings of UTF-8 characters instead of just byte strings. However, it is available only if PCRE has been built to include UTF-8 support. If not, the use of this option provokes an error. Support for UTF-8 is new, experimental, and incomplete. Details of exactly what it entails are given below.

  • STUDYING A PATTERN

    When a pattern is going to be used several times, it is worth spending more time analyzing it in order to speed up the time taken for matching. The function pcre_study() takes a pointer to a compiled pattern as its first argument, and returns a pointer to a pcre_extra block (another void typedef) containing additional information about the pattern; this can be passed to pcre_exec(). If no additional information is available, NULL is returned.

    The second argument contains option bits. At present, two options are defined for pcre_study(), PCRE_STUDY_NO_PRUNE and PCRE_STUDY_NO_START, which skip one of the available regex-studying algorithms.

    The third argument for pcre_study() is a pointer to an error message. If studying succeeds (even if no data is returned), the variable it points to is set to NULL. Otherwise it points to a textual error message.

    Studying a pattern is very useful for non-anchored patterns that do not have a single fixed starting character or that start with a fixed-length (no stars) pattern, because in this case PCRE builds data structures that allow the matcher to skip several characters when looking for a place to start matching. This study can be inhibited by PCRE_STUDY_NO_START.

    In addition, when PCRE_STUDY_NO_PRUNE is not specified, pcre_study() tries to cut backtracking paths by looking for constructs such as [^;]*; or \d*\. (if digits are to be followed by a period, which is not a digit, there's no use in backtracking). This often can limit the exponential behavior of the matcher and speed up failing attempts to match a pattern.

  • LOCALE SUPPORT

    PCRE handles caseless matching, and determines whether characters are letters, digits, or whatever, by reference to a set of tables. The library contains a default set of tables which is created in the default C locale when PCRE is compiled. This is used when the final argument of pcre_compile() is NULL, and is sufficient for many applications.

    An alternative set of tables can, however, be supplied. Such tables are built by calling the pcre_maketables() function, which has no arguments, in the relevant locale. The result can then be passed to pcre_compile() as often as necessary. For example, to build and use tables that are appropriate for the French locale (where accented characters with codes greater than 128 are treated as letters), the following code could be used:

      setlocale(LC_CTYPE, "fr");
      tables = pcre_maketables();
      re = pcre_compile(..., tables);
    

    The tables are built in memory that is obtained via pcre_malloc. The pointer that is passed to pcre_compile is saved with the compiled pattern, and the same tables are used via this pointer by pcre_study() and pcre_exec(). Thus for any single pattern, compilation, studying and matching all happen in the same locale, but different patterns can be compiled in different locales. It is the caller's responsibility to ensure that the memory containing the tables remains available for as long as it is needed.

  • INFORMATION ABOUT A PATTERN

    The pcre_fullinfo() function returns information about a compiled pattern. The first argument for pcre_fullinfo() is a pointer to the compiled pattern. The second argument is the result of pcre_study(), or NULL if the pattern was not studied. The third argument specifies which piece of information is required, while the fourth argument is a pointer to a variable to receive the data. The yield of the function is zero for success, or one of the following negative numbers:

      PCRE_ERROR_NULL       the argument code was NULL
                            the argument where was NULL
      PCRE_ERROR_BADMAGIC   the "magic number" was not found
      PCRE_ERROR_BADOPTION  the value of what was invalid
    

    The possible values for the third argument are defined in pcre.h, and are as follows:

      PCRE_INFO_OPTIONS
    

    Return a copy of the options with which the pattern was compiled. The fourth argument should point to au unsigned long int variable. These option bits are those specified in the call to pcre_compile(), modified by any top-level option settings within the pattern itself, and with the PCRE_ANCHORED bit forcibly set if the form of the pattern implies that it can match only at the start of a subject string.

      PCRE_INFO_SIZE
    

    Return the size of the compiled pattern, that is, the value that was passed as the argument to pcre_malloc() when PCRE was getting memory in which to place the compiled data. The fourth argument should point to a size_t variable.

      PCRE_INFO_CAPTURECOUNT
    

    Return the number of capturing subpatterns in the pattern. The fourth argument should point to an \fbint\fR variable.

      PCRE_INFO_BACKREFMAX
    

    Return the number of the highest back reference in the pattern. The fourth argument should point to an int variable. Zero is returned if there are no back references.

      PCRE_INFO_FIRSTCHAR
    

    Return information about the first character of any matched string, for a non-anchored pattern. If there is a fixed first character, e.g. from a pattern such as (cat|cow|coyote), it is returned in the integer pointed to by where. Otherwise, if either

    (a) the pattern was compiled with the PCRE_MULTILINE option, and every branch starts with "^", or

    (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set (if it were set, the pattern would be anchored),

    -1 is returned, indicating that the pattern matches only at the start of a subject string or after any "\n" within the string. Otherwise -2 is returned. For anchored patterns, -2 is returned.

      PCRE_INFO_FIRSTTABLE
    

    If the pattern was studied, and this resulted in the construction of a 256-bit table indicating a fixed set of characters for the first character in any matching string, a pointer to the table is returned. Otherwise NULL is returned. The fourth argument should point to an unsigned char * variable.

      PCRE_INFO_LASTLITERAL
    

    For a non-anchored pattern, return the value of the rightmost literal character which must exist in any matched string, other than at its start. The fourth argument should point to an int variable. If there is no such character, or if the pattern is anchored, -1 is returned. For example, for the pattern /a\d+z\d+/ the returned value is 'z'.

  • MATCHING A PATTERN

    The function pcre_exec() is called to match a subject string against a pre-compiled pattern, which is passed in the code argument. If the pattern has been studied, the result of the study should be passed in the extra argument. Otherwise this must be NULL.

    The PCRE_ANCHORED option can be passed in the options argument, whose unused bits must be zero. However, if a pattern was compiled with PCRE_ANCHORED, or turned out to be anchored by virtue of its contents, it cannot be made unachored at matching time.

    There are also three further options that can be set only at matching time:

      PCRE_NOTBOL
    

    The first character of the string is not the beginning of a line, so the circumflex metacharacter should not match before it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex never to match.

      PCRE_NOTEOL
    

    The end of the string is not the end of a line, so the dollar metacharacter should not match it nor (except in multiline mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at compile time) causes dollar never to match.

      PCRE_NOTEMPTY
    

    An empty string is not considered to be a valid match if this option is set. If there are alternatives in the pattern, they are tried. If all the alternatives match the empty string, the entire match fails. For example, if the pattern

      a?b?
    

    is applied to a string not beginning with "a" or "b", it matches the empty string at the start of the subject. With PCRE_NOTEMPTY set, this match is not valid, so PCRE searches further into the string for occurrences of "a" or "b".

    Perl has no direct equivalent of PCRE_NOTEMPTY, but it does make a special case of a pattern match of the empty string within its split() function, and when using the /g modifier. It is possible to emulate Perl's behaviour after matching a null string by first trying the match again at the same offset with PCRE_NOTEMPTY set, and then if that fails by advancing the starting offset (see below) and trying an ordinary match again.

    The subject string is passed as a pointer in subject, a length in length, and a starting offset in startoffset. Unlike the pattern string, it may contain binary zero characters. When the starting offset is zero, the search for a match starts at the beginning of the subject, and this is by far the most common case.

    A non-zero starting offset is useful when searching for another match in the same subject by calling pcre_exec() again after a previous success. Setting startoffset differs from just passing over a shortened string and setting PCRE_NOTBOL in the case of a pattern that begins with any kind of lookbehind. For example, consider the pattern

      \Biss\B
    

    which finds occurrences of "iss" in the middle of words. (\B matches only if the current position in the subject is not a word boundary.) When applied to the string "Mississipi" the first call to pcre_exec() finds the first occurrence. If pcre_exec() is called again with just the remainder of the subject, namely "issipi", it does not match, because \B is always false at the start of the subject, which is deemed to be a word boundary. However, if pcre_exec() is passed the entire string again, but with startoffset set to 4, it finds the second occurrence of "iss" because it is able to look behind the starting point to discover that it is preceded by a letter.

    If a non-zero starting offset is passed when the pattern is anchored, one attempt to match at the given offset is tried. This can only succeed if the pattern does not require the match to be at the start of the subject.

    In general, a pattern matches a certain portion of the subject, and in addition, further substrings from the subject may be picked out by parts of the pattern. Following the usage in Jeffrey Friedl's book, this is called "capturing" in what follows, and the phrase "capturing subpattern" is used for a fragment of a pattern that picks out a substring. PCRE supports several other kinds of parenthesized subpattern that do not cause substrings to be captured.

    Captured substrings are returned to the caller via a vector of integer offsets whose address is passed in ovector. The number of elements in the vector is passed in ovecsize. The first two-thirds of the vector is used to pass back captured substrings, each substring using a pair of integers. The remaining third of the vector is used as workspace by pcre_exec() while matching capturing subpatterns, and is not available for passing back information. The length passed in ovecsize should always be a multiple of three. If it is not, it is rounded down.

    When a match has been successful, information about captured substrings is returned in pairs of integers, starting at the beginning of ovector, and continuing up to two-thirds of its length at the most. The first element of a pair is set to the offset of the first character in a substring, and the second is set to the offset of the first character after the end of a substring. The first pair, ovector[0] and ovector[1], identify the portion of the subject string matched by the entire pattern. The next pair is used for the first capturing subpattern, and so on. The value returned by pcre_exec() is the number of pairs that have been set. If there are no capturing subpatterns, the return value from a successful match is 1, indicating that just the first pair of offsets has been set.

    Some convenience functions are provided for extracting the captured substrings as separate strings. These are described in the following section.

    It is possible for an capturing subpattern number n+1 to match some part of the subject when subpattern n has not been used at all. For example, if the string "abc" is matched against the pattern (a|(z))(bc) subpatterns 1 and 3 are matched, but 2 is not. When this happens, both offset values corresponding to the unused subpattern are set to -1.

    If a capturing subpattern is matched repeatedly, it is the last portion of the string that it matched that gets returned.

    If the vector is too small to hold all the captured substrings, it is used as far as possible (up to two-thirds of its length), and the function returns a value of zero. In particular, if the substring offsets are not of interest, pcre_exec() may be called with ovector passed as NULL and ovecsize as zero. However, if the pattern contains back references and the ovector isn't big enough to remember the related substrings, PCRE has to get additional memory for use during matching. Thus it is usually advisable to supply an ovector.

    Note that pcre_info() can be used to find out how many capturing subpatterns there are in a compiled pattern. The smallest size for ovector that will allow for n captured substrings in addition to the offsets of the substring matched by the whole pattern is (n+1)*3.

    If pcre_exec() fails, it returns a negative number. The following are defined in the header file:

      PCRE_ERROR_NOMATCH        (-1)
    

    The subject string did not match the pattern.

      PCRE_ERROR_NULL           (-2)
    

    Either code or subject was passed as NULL, or ovector was NULL and ovecsize was not zero.

      PCRE_ERROR_BADOPTION      (-3)
    

    An unrecognized bit was set in the options argument.

      PCRE_ERROR_BADMAGIC       (-4)
    

    PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch the case when it is passed a junk pointer. This is the error it gives when the magic number isn't present.

      PCRE_ERROR_UNKNOWN_NODE   (-5)
    

    While running the pattern match, an unknown item was encountered in the compiled pattern. This error could be caused by a bug in PCRE or by overwriting of the compiled pattern.

      PCRE_ERROR_NOMEMORY       (-6)
    

    If a pattern contains back references, but the ovector that is passed to pcre_exec() is not big enough to remember the referenced substrings, PCRE gets a block of memory at the start of matching to use for this purpose. If the call via pcre_malloc() fails, this error is given. The memory is freed at the end of matching.

  • EXTRACTING CAPTURED SUBSTRINGS

    Captured substrings can be accessed directly by using the offsets returned by pcre_exec() in ovector. For convenience, the functions pcre_copy_substring(), pcre_get_substring(), and pcre_get_substring_list() are provided for extracting captured substrings as new, separate, zero-terminated strings. A substring that contains a binary zero is correctly extracted and has a further zero added on the end, but the result does not, of course, function as a C string.

    The first three arguments are the same for all three functions: subject is the subject string which has just been successfully matched, ovector is a pointer to the vector of integer offsets that was passed to pcre_exec(), and stringcount is the number of substrings that were captured by the match, including the substring that matched the entire regular expression. This is the value returned by pcre_exec if it is greater than zero. If pcre_exec() returned zero, indicating that it ran out of space in ovector, the value passed as stringcount should be the size of the vector divided by three.

    The functions pcre_copy_substring() and pcre_get_substring() extract a single substring, whose number is given as stringnumber. A value of zero extracts the substring that matched the entire pattern, while higher values extract the captured substrings. For pcre_copy_substring(), the string is placed in buffer, whose length is given by buffersize, while for pcre_get_substring() a new block of memory is obtained via pcre_malloc, and its address is returned via stringptr. The yield of the function is the length of the string, not including the terminating zero, or one of

      PCRE_ERROR_NOMEMORY       (-6)
    

    The buffer was too small for pcre_copy_substring(), or the attempt to get memory failed for pcre_get_substring().

      PCRE_ERROR_NOSUBSTRING    (-7)
    

    There is no substring whose number is stringnumber.

    The pcre_get_substring_list() function extracts all available substrings and builds a list of pointers to them. All this is done in a single block of memory which is obtained via pcre_malloc. The address of the memory block is returned via listptr, which is also the start of the list of string pointers. The end of the list is marked by a NULL pointer. The yield of the function is zero if all went well, or

      PCRE_ERROR_NOMEMORY       (-6)
    

    if the attempt to get the memory block failed.

    When any of these functions encounter a substring that is unset, which can happen when capturing subpattern number n+1 matches some part of the subject, but subpattern n has not been used at all, they return an empty string. This can be distinguished from a genuine zero-length substring by inspecting the appropriate offset in ovector, which is negative for unset substrings.

    The two convenience functions pcre_free_substring() and pcre_free_substring_list() can be used to free the memory returned by a previous call of pcre_get_substring() or pcre_get_substring_list(), respectively. They do nothing more than call the function pointed to by pcre_free, which of course could be called directly from a C program. However, PCRE is used in some situations where it is linked via a special interface to another programming language which cannot use pcre_free directly; it is for these cases that the functions are provided.

  • AUTHOR

    Philip Hazel <ph10@cam.ac.uk>
    University Computing Service,
    New Museums Site,
    Cambridge CB2 3QG, England.
    Phone: +44 1223 334714

    Last updated: 28 August 2000,

      the 250th anniversary of the death of J.S. Bach.
    
    Copyright (c) 1997-2000 University of Cambridge. sed-3.62/doc/sed-in.texi0000644000076600007660000041501210163556175012007 00000000000000\input texinfo @c -*-texinfo-*- @c @c -- Stuff that needs adding: ---------------------------------------------- @c (document the `;' command-separator) @c -------------------------------------------------------------------------- @c Check for consistency: regexps in @code, text that they match in @samp. @c @c Tips: @c @command for command @c @samp for command fragments: @samp{cat -s} @c @code for sed commands and flags @c Use ``quote'' not `quote' or "quote". @c @c %**start of header @setfilename sed.info @settitle sed, a stream editor @c %**end of header @c @smallbook @include version.texi @c Combine indices. @syncodeindex ky cp @syncodeindex pg cp @syncodeindex tp cp @defcodeindex op @syncodeindex op fn @include config.texi @copying This file documents version @value{VERSION} of @value{SSED}, a stream editor. Copyright @copyright{} 1998, 1999, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This document is released under the terms of the @acronym{GNU} Free Documentation License as published by the Free Software Foundation; either version 1.1, or (at your option) any later version. You should have received a copy of the @acronym{GNU} Free Documentation License along with @value{SSED}; see the file @file{COPYING.DOC}. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. There are no Cover Texts and no Invariant Sections; this text, along with its equivalent in the printed manual, constitutes the Title Page. @end copying @setchapternewpage off @titlepage @title @command{sed}, a stream editor @subtitle version @value{VERSION}, @value{UPDATED} @author by Ken Pizzini, Paolo Bonzini @page @vskip 0pt plus 1filll Copyright @copyright{} 1998, 1999 Free Software Foundation, Inc. @insertcopying Published by the Free Software Foundation, @* 59 Temple Place - Suite 330 @* Boston, MA 02111-1307, USA @end titlepage @node Top @top @ifnottex @insertcopying @end ifnottex @menu * Introduction:: Introduction * Invoking sed:: Invocation * sed Programs:: @command{sed} programs * Examples:: Some sample scripts * Limitations:: Limitations and (non-)limitations of @value{SSED} * Other Resources:: Other resources for learning about @command{sed} * Reporting Bugs:: Reporting bugs * Extended regexps:: @command{egrep}-style regular expressions @ifset PERL * Perl regexps:: Perl-style regular expressions @end ifset * Concept Index:: A menu with all the topics in this manual. * Command and Option Index:: A menu with all @command{sed} commands and command-line options. @detailmenu --- The detailed node listing --- sed Programs: * Execution Cycle:: How @command{sed} works * Addresses:: Selecting lines with @command{sed} * Regular Expressions:: Overview of regular expression syntax * Common Commands:: Often used commands * The "s" Command:: @command{sed}'s Swiss Army Knife * Other Commands:: Less frequently used commands * Programming Commands:: Commands for @command{sed} gurus * Extended Commands:: Commands specific of @value{SSED} * Escapes:: Specifying special characters Examples: * Centering lines:: * Increment a number:: * Rename files to lower case:: * Print bash environment:: * Reverse chars of lines:: * tac:: Reverse lines of files * cat -n:: Numbering lines * cat -b:: Numbering non-blank lines * wc -c:: Counting chars * wc -w:: Counting words * wc -l:: Counting lines * head:: Printing the first lines * tail:: Printing the last lines * uniq:: Make duplicate lines unique * uniq -d:: Print duplicated lines of input * uniq -u:: Remove all duplicated lines * cat -s:: Squeezing blank lines @ifset PERL Perl regexps:: Perl-style regular expressions * Backslash:: Introduces special sequences * Circumflex/dollar sign/period:: Behave specially with regard to new lines * Square brackets:: Are a bit different in strange cases * Options setting:: Toggle modifiers in the middle of a regexp * Non-capturing subpatterns:: Are not counted when backreferencing * Repetition:: Allows for non-greedy matching * Backreferences:: Allows for more than 10 back references * Assertions:: Allows for complex look ahead matches * Non-backtracking subpatterns:: Often gives more performance * Conditional subpatterns:: Allows if/then/else branches * Recursive patterns:: For example to match parentheses * Comments:: Because things can get complex... @end ifset @end detailmenu @end menu @node Introduction @chapter Introduction @cindex Stream editor @command{sed} is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as @command{ed}), @command{sed} works by making only one pass over the input(s), and is consequently more efficient. But it is @command{sed}'s ability to filter text in a pipeline which particularly distinguishes it from other types of editors. @node Invoking sed @chapter Invocation Normally @command{sed} is invoked like this: @example sed SCRIPT INPUTFILE... @end example The full format for invoking @command{sed} is: @example sed OPTIONS... [SCRIPT] [INPUTFILE...] @end example If you do not specify @var{INPUTFILE}, or if @var{INPUTFILE} is @file{-}, @command{sed} filters the contents of the standard input. The @var{script} is actually the first non-option parameter, which @command{sed} specially considers a script and not an input file if (and only if) none of the other @var{options} specifies a script to be executed, that is if neither of the @option{-e} and @option{-f} options is specified. @command{sed} may be invoked with the following command-line options: @table @code @item --version @opindex --version @cindex Version, printing Print out the version of @command{sed} that is being run and a copyright notice, then exit. @item --help @opindex --help @cindex Usage summary, printing Print a usage message briefly summarizing these command-line options and the bug-reporting address, then exit. @item -n @itemx --quiet @itemx --silent @opindex -n @opindex --quiet @opindex --silent @cindex Disabling autoprint, from command line By default, @command{sed} prints out the pattern space at the end of each cycle through the script. These options disable this automatic printing, and @command{sed} only produces output when explicitly told to via the @code{p} command. @item -i[@var{SUFFIX}] @itemx --in-place[=@var{SUFFIX}] @opindex -i @opindex --in-place @cindex In-place editing, activating @cindex @value{SSEDEXT}, in-place editing This option specifies that files are to be edited in-place. @value{SSED} does this by creating a temporary file and sending output to this file rather than to the standard output.@footnote{This applies to commands such as @code{=}, @code{a}, @code{c}, @code{i}, @code{l}, @code{p}. You can still write to the standard output by using the @code{w} @cindex @value{SSEDEXT}, @file{/dev/stdout} file or @code{W} commands together with the @file{/dev/stdout} special file}. This option implies @option{-s}. When the end of the file is reached, the temporary file is renamed to the output file's original name. The extension, if supplied, is used to modify the name of the old file before renaming the temporary file, thereby making a backup copy@footnote{Note that @value{SSED} creates the backup file whether or not any output is actually changed.}). @cindex In-place editing, Perl-style backup file names This rule is followed: if the extension doesn't contain a @code{*}, then it is appended to the end of the current filename as a suffix; if the extension does contain one or more @code{*} characters, then @emph{each} asterisk is replaced with the current filename. This allows you to add a prefix to the backup file, instead of (or in addition to) a suffix, or even to place backup copies of the original files into another directory (provided the directory already exists). If no extension is supplied, the original file is overwritten without making a backup. @item -l @var{N} @itemx --line-length=@var{N} @opindex -l @opindex --line-length @cindex Line length, setting Specify the default line-wrap length for the @code{l} command. A length of 0 (zero) means to never wrap long lines. If not specified, it is taken to be 70. @item --posix @cindex @value{SSEDEXT}, disabling @value{SSED} includes several extensions to @acronym{POSIX} sed. In order to simplify writing portable scripts, this option disables all the extensions that this manual documents, including additional commands. @cindex @code{POSIXLY_CORRECT} behavior, enabling Most of the extensions accept @command{sed} programs that are outside the syntax mandated by @acronym{POSIX}, but some of them (such as the behavior of the @command{N} command described in @pxref{Reporting Bugs}) actually violate the standard. If you want to disable only the latter kind of extension, you can set the @code{POSIXLY_CORRECT} variable to a non-empty value. @item -r @itemx --regexp-extended @opindex -r @opindex --regexp-extended @cindex Extended regular expressions, choosing @cindex @acronym{GNU} extensions, extended regular expressions Use extended regular expressions rather than basic regular expressions. Extended regexps are those that @command{egrep} accepts; they can be clearer because they usually have less backslashes, but are a @acronym{GNU} extension and hence scripts that use them are not portable. @xref{Extended regexps, , Extended regular expressions}. @ifset PERL @item -R @itemx --regexp-perl @opindex -R @opindex --regexp-perl @cindex Perl-style regular expressions, choosing @cindex @value{SSEDEXT}, Perl-style regular expressions Use Perl-style regular expressions rather than basic regular expressions. Perl-style regexps are extremely powerful but are a @value{SSED} extension and hence scripts that use it are not portable. @xref{Perl regexps, , Perl-style regular expressions}. @end ifset @item -s @itemx --separate @cindex Working on separate files By default, @command{sed} will consider the files specified on the command line as a single continuous long stream. This @value{SSED} extension allows the user to consider them as separate files: range addresses (such as @samp{/abc/,/def/}) are not allowed to span several files, line numbers are relative to the start of each file, @code{$} refers to the last line of each file, and files invoked from the @code{R} commands are rewound at the start of each file. @item -u @itemx --unbuffered @opindex -u @opindex --unbuffered @cindex Unbuffered I/O, choosing Buffer both input and output as minimally as practical. (This is particularly useful if the input is coming from the likes of @samp{tail -f}, and you wish to see the transformed output as soon as possible.) @item -e @var{script} @itemx --expression=@var{script} @opindex -e @opindex --expression @cindex Script, from command line Add the commands in @var{script} to the set of commands to be run while processing the input. @item -f @var{script-file} @itemx --file=@var{script-file} @opindex -f @opindex --file @cindex Script, from a file Add the commands contained in the file @var{script-file} to the set of commands to be run while processing the input. @end table If no @option{-e}, @option{-f}, @option{--expression}, or @option{--file} options are given on the command-line, then the first non-option argument on the command line is taken to be the @var{script} to be executed. @cindex Files to be processed as input If any command-line parameters remain after processing the above, these parameters are interpreted as the names of input files to be processed. @cindex Standard input, processing as input A file name of @samp{-} refers to the standard input stream. The standard input will be processed if no file names are specified. @node sed Programs @chapter @command{sed} Programs @cindex @command{sed} program structure @cindex Script structure A @command{sed} program consists of one or more @command{sed} commands, passed in by one or more of the @option{-e}, @option{-f}, @option{--expression}, and @option{--file} options, or the first non-option argument if zero of these options are used. This document will refer to ``the'' @command{sed} script; this is understood to mean the in-order catenation of all of the @var{script}s and @var{script-file}s passed in. Each @code{sed} command consists of an optional address or address range, followed by a one-character command name and any additional command-specific code. @menu * Execution Cycle:: How @command{sed} works * Addresses:: Selecting lines with @command{sed} * Regular Expressions:: Overview of regular expression syntax * Common Commands:: Often used commands * The "s" Command:: @command{sed}'s Swiss Army Knife * Other Commands:: Less frequently used commands * Programming Commands:: Commands for @command{sed} gurus * Extended Commands:: Commands specific of @value{SSED} * Escapes:: Specifying special characters @end menu @node Execution Cycle @section How @command{sed} Works @cindex Buffer spaces, pattern and hold @cindex Spaces, pattern and hold @cindex Pattern space, definition @cindex Hold space, definition @command{sed} maintains two data buffers: the active @emph{pattern} space, and the auxiliary @emph{hold} space. Both are initially empty. @command{sed} operates by performing the following cycle on each lines of input: first, @command{sed} reads one line from the input stream, removes any trailing newline, and places it in the pattern space. Then commands are executed; each command can have an address associated to it: addresses are a kind of condition code, and a command is only executed if the condition is verified before the command is to be executed. When the end of the script is reached, unless the @option{-n} option is in use, the contents of pattern space are printed out to the output stream, adding back the trailing newline if it was removed.@footnote{Actually, if @command{sed} prints a line without the terminating newline, it will nevertheless print the missing newline as soon as more text is sent to the same output stream, which gives the ``least expected surprise'' even though it does not make commands like @samp{sed -n p} exactly identical to @command{cat}.} Then the next cycle starts for the next input line. Unless special commands (like @samp{D}) are used, the pattern space is deleted between two cycles. The hold space, on the other hand, keeps its data between cycles (see commands @samp{h}, @samp{H}, @samp{x}, @samp{g}, @samp{G} to move data between both buffers). @node Addresses @section Selecting lines with @command{sed} @cindex Addresses, in @command{sed} scripts @cindex Line selection @cindex Selecting lines to process Addresses in a @command{sed} script can be in any of the following forms: @table @code @item @var{number} @cindex Address, numeric @cindex Line, selecting by number Specifying a line number will match only that line in the input. (Note that @command{sed} counts lines continuously across all input files unless @option{-i} or @option{-s} options are specified.) @item @var{first}~@var{step} @cindex @acronym{GNU} extensions, @samp{@var{n}~@var{m}} addresses This @acronym{GNU} extension matches every @var{step}th line starting with line @var{first}. In particular, lines will be selected when there exists a non-negative @var{n} such that the current line-number equals @var{first} + (@var{n} * @var{step}). Thus, to select the odd-numbered lines, one would use @code{1~2}; to pick every third line starting with the second, @samp{2~3} would be used; to pick every fifth line starting with the tenth, use @samp{10~5}; and @samp{50~0} is just an obscure way of saying @code{50}. @item $ @cindex Address, last line @cindex Last line, selecting @cindex Line, selecting last This address matches the last line of the last file of input, or the last line of each file when the @option{-i} or @option{-s} options are specified. @item /@var{regexp}/ @cindex Address, as a regular expression @cindex Line, selecting by regular expression match This will select any line which matches the regular expression @var{regexp}. If @var{regexp} itself includes any @code{/} characters, each must be escaped by a backslash (@code{\}). @cindex empty regular expression @cindex @value{SSEDEXT}, modifiers and the empty regular expression The empty regular expression @samp{//} repeats the last regular expression match (the same holds if the empty regular expression is passed to the @code{s} command). Note that modifiers to regular expressions are evaluated when the regular expression is compiled, thus it is invalid to specify them together with the empty regular expression. @item \%@var{regexp}% (The @code{%} may be replaced by any other single character.) @cindex Slash character, in regular expressions This also matches the regular expression @var{regexp}, but allows one to use a different delimiter than @code{/}. This is particularly useful if the @var{regexp} itself contains a lot of slashes, since it avoids the tedious escaping of every @code{/}. If @var{regexp} itself includes any delimiter characters, each must be escaped by a backslash (@code{\}). @item /@var{regexp}/I @itemx \%@var{regexp}%I @cindex @acronym{GNU} extensions, @code{I} modifier @ifset PERL @cindex Perl-style regular expressions, case-insensitive @end ifset The @code{I} modifier to regular-expression matching is a @acronym{GNU} extension which causes the @var{regexp} to be matched in a case-insensitive manner. @item /@var{regexp}/M @itemx \%@var{regexp}%M @ifset PERL @cindex @value{SSEDEXT}, @code{M} modifier @end ifset @cindex Perl-style regular expressions, multiline The @code{M} modifier to regular-expression matching is a @value{SSED} extension which causes @code{^} and @code{$} to match respectively (in addition to the normal behavior) the empty string after a newline, and the empty string before a newline. There are special character sequences @ifset PERL (@code{\A} and @code{\Z} in Perl mode, @code{\`} and @code{\'} in basic or extended regular expression modes) @end ifset @ifclear PERL (@code{\`} and @code{\'}) @end ifclear which always match the beginning or the end of the buffer. @code{M} stands for @cite{multi-line}. @ifset PERL @item /@var{regexp}/S @itemx \%@var{regexp}%S @cindex @value{SSEDEXT}, @code{S} modifier @cindex Perl-style regular expressions, single line The @code{S} modifier to regular-expression matching is only valid in Perl mode and specifies that the dot character (@code{.}) will match the newline character too. @code{S} stands for @cite{single-line}. @end ifset @ifset PERL @item /@var{regexp}/X @itemx \%@var{regexp}%X @cindex @value{SSEDEXT}, @code{X} modifier @cindex Perl-style regular expressions, extended The @code{X} modifier to regular-expression matching is also valid in Perl mode only. If it is used, whitespace in the pattern (other than in a character class) and characters between a @kbd{#} outside a character class and the next newline character are ignored. An escaping backslash can be used to include a whitespace or @kbd{#} character as part of the pattern. @end ifset @end table If no addresses are given, then all lines are matched; if one address is given, then only lines matching that address are matched. @cindex Range of lines @cindex Several lines, selecting An address range can be specified by specifying two addresses separated by a comma (@code{,}). An address range matches lines starting from where the first address matches, and continues until the second address matches (inclusively). If the second address is a @var{regexp}, then checking for the ending match will start with the line @emph{following} the line which matched the first address: a range will always span at least two lines (except of course if the input stream ends). If the second address is a @var{number} less than (or equal to) the line matching the first address, then only the one line is matched. @cindex Special addressing forms @cindex Range with start address of zero @cindex Zero, as range start address @cindex @var{addr1},+N @cindex @var{addr1},~N @cindex @acronym{GNU} extensions, special two-address forms @cindex @acronym{GNU} extensions, @code{0} address @cindex @acronym{GNU} extensions, 0,@var{addr2} addressing @cindex @acronym{GNU} extensions, @var{addr1},+@var{N} addressing @cindex @acronym{GNU} extensions, @var{addr1},~@var{N} addressing @value{SSED} also supports some special two-address forms; all these are @acronym{GNU} extensions: @table @code @item 0,/@var{regexp}/ A line number of @code{0} can be used in an address specification like @code{0,/@var{regexp}/} so that @command{sed} will try to match @var{regexp} in the first input line too. In other words, @code{0,/@var{regexp}/} is similar to @code{1,/@var{regexp}/}, except that if @var{addr2} matches the very first line of input the @code{0,/@var{regexp}/} form will consider it to end the range, whereas the @code{1,/@var{regexp}/} form will match the beginning of its range and hence make the range span up to the @emph{second} occurrence of the regular expression. Note that this is the only place where the @code{0} address makes sense; there is no 0-th line and commands which are given the @code{0} address in any other way will give an error. @item @var{addr1},+@var{N} Matches @var{addr1} and the @var{N} lines following @var{addr1}. @item @var{addr1},~@var{N} Matches @var{addr1} and the lines following @var{addr1} until the next line whose input line number is a multiple of @var{N}. @end table @cindex Excluding lines @cindex Selecting non-matching lines Appending the @code{!} character to the end of an address specification negates the sense of the match. That is, if the @code{!} character follows an address range, then only lines which do @emph{not} match the address range will be selected. This also works for singleton addresses, and, perhaps perversely, for the null address. @node Regular Expressions @section Overview of Regular Expression Syntax To know how to use @command{sed}, people should understand regular expressions (@dfn{regexp} for short). A regular expression is a pattern that is matched against a subject string from left to right. Most characters are @dfn{ordinary}: they stand for themselves in a pattern, and match the corresponding characters in the subject. As a trivial example, the pattern @example The quick brown fox @end example @noindent matches a portion of a subject string that is identical to itself. The power of regular expressions comes from the ability to include alternatives and repetitions in the pattern. These are encoded in the pattern by the use of @dfn{special characters}, which do not stand for themselves but instead are interpreted in some special way. Here is a brief description of regular expression syntax as used in @command{sed}. @table @code @item @var{char} A single ordinary character matches itself. @item * @cindex @acronym{GNU} extensions, to basic regular expressions Matches a sequence of zero or more instances of matches for the preceding regular expression, which must be an ordinary character, a special character preceded by @code{\}, a @code{.}, a grouped regexp (see below), or a bracket expression. As a @acronym{GNU} extension, a postfixed regular expression can also be followed by @code{*}; for example, @code{a**} is equivalent to @code{a*}. @acronym{POSIX} 1003.1-2001 says that @code{*} stands for itself when it appears at the start of a regular expression or subexpression, but many non@acronym{GNU} implementations do not support this and portable scripts should instead use @code{\*} in these contexts. @item \+ @cindex @acronym{GNU} extensions, to basic regular expressions As @code{*}, but matches one or more. It is a @acronym{GNU} extension. @item \? @cindex @acronym{GNU} extensions, to basic regular expressions As @code{*}, but only matches zero or one. It is a @acronym{GNU} extension. @item \@{@var{i}\@} As @code{*}, but matches exactly @var{i} sequences (@var{i} is a decimal integer; for portability, keep it between 0 and 255 inclusive). @item \@{@var{i},@var{j}\@} Matches between @var{i} and @var{j}, inclusive, sequences. @item \@{@var{i},\@} Matches more than or equal to @var{i} sequences. @item \(@var{regexp}\) Groups the inner @var{regexp} as a whole, this is used to: @itemize @bullet @item @cindex @acronym{GNU} extensions, to basic regular expressions Apply postfix operators, like @code{\(abcd\)*}: this will search for zero or more whole sequences of @samp{abcd}, while @code{abcd*} would search for @samp{abc} followed by zero or more occurrences of @samp{d}. Note that support for @code{\(abcd\)*} is required by @acronym{POSIX} 1003.1-2001, but many non-@acronym{GNU} implementations do not support it and hence it is not universally portable. @item Use back references (see below). @end itemize @item . Matches any character, including newline. @item ^ Matches the null string at beginning of line, i.e. what appears after the circumflex must appear at the beginning of line. @code{^#include} will match only lines where @samp{#include} is the first thing on line---if there are spaces before, for example, the match fails. @code{^} acts as a special character only at the beginning of the regular expression or subexpression (that is, after @code{\(} or @code{\|}). Portable scripts should avoid @code{^} at the beginning of a subexpression, though, as @acronym{POSIX} allows implementations that treat @code{^} as an ordinary character in that context. @item $ It is the same as @code{^}, but refers to end of line. @code{$} also acts as a special character only at the end of the regular expression or subexpression (that is, before @code{\)} or @code{\|}), and its use at the end of a subexpression is not portable. @item [@var{list}] @itemx [^@var{list}] Matches any single character in @var{list}: for example, @code{[aeiou]} matches all vowels. A list may include sequences like @code{@var{char1}-@var{char2}}, which matches any character between (inclusive) @var{char1} and @var{char2}. A leading @code{^} reverses the meaning of @var{list}, so that it matches any single character @emph{not} in @var{list}. To include @code{]} in the list, make it the first character (after the @code{^} if needed), to include @code{-} in the list, make it the first or last; to include @code{^} put it after the first character. @cindex @code{POSIXLY_CORRECT} behavior, bracket expressions The characters @code{$}, @code{*}, @code{.}, @code{[}, and @code{\} are normally not special within @var{list}. For example, @code{[\*]} matches either @samp{\} or @samp{*}, because the @code{\} is not special here. However, strings like @code{[.ch.]}, @code{[=a=]}, and @code{[:space:]} are special within @var{list} and represent collating symbols, equivalence classes, and character classes, respectively, and @code{[} is therefore special within @var{list} when it is followed by @code{.}, @code{=}, or @code{:}. Also, when not in @env{POSIXLY_CORRECT} mode, special escapes like @code{\n} and @code{\t} are recognized within @var{list}. @xref{Escapes}. @item @var{regexp1}\|@var{regexp2} @cindex @acronym{GNU} extensions, to basic regular expressions Matches either @var{regexp1} or @var{regexp2}. Use parentheses to use complex alternative regular expressions. The matching process tries each alternative in turn, from left to right, and the first one that succeeds is used. It is a @acronym{GNU} extension. @item @var{regexp1}@var{regexp2} Matches the concatenation of @var{regexp1} and @var{regexp2}. Concatenation binds more tightly than @code{\|}, @code{^}, and @code{$}, but less tightly than the other regular expression operators. @item \@var{digit} Matches the @var{digit}-th @code{\(@dots{}\)} parenthesized subexpression in the regular expression. This is called a @dfn{back reference}. Subexpressions are implicity numbered by counting occurrences of @code{\(} left-to-right. @item \n Matches the newline character. @item \@var{char} Matches @var{char}, where @var{char} is one of @code{$}, @code{*}, @code{.}, @code{[}, @code{\}, or @code{^}. Note that the only C-like backslash sequences that you can portably assume to be interpreted are @code{\n} and @code{\\}; in particular @code{\t} is not portable, and matches a @samp{t} under most implementations of @command{sed}, rather than a tab character. @end table @cindex Greedy regular expression matching Note that the regular expression matcher is greedy, i.e., matches are attempted from left to right and, if two or more matches are possible starting at the same character, it selects the longest. @noindent Examples: @table @samp @item abcdef Matches @samp{abcdef}. @item a*b Matches zero or more @samp{a}s followed by a single @samp{b}. For example, @samp{b} or @samp{aaaaab}. @item a\?b Matches @samp{b} or @samp{ab}. @item a\+b\+ Matches one or more @samp{a}s followed by one or more @samp{b}s: @samp{ab} is the shortest possible match, but other examples are @samp{aaaab} or @samp{abbbbb} or @samp{aaaaaabbbbbbb}. @item .* @itemx .\+ These two both match all the characters in a string; however, the first matches every string (including the empty string), while the second matches only strings containing at least one character. @item ^main.*(.*) his matches a string starting with @samp{main}, followed by an opening and closing parenthesis. The @samp{n}, @samp{(} and @samp{)} need not be adjacent. @item ^# This matches a string beginning with @samp{#}. @item \\$ This matches a string ending with a single backslash. The regexp contains two backslashes for escaping. @item \$ Instead, this matches a string consisting of a single dollar sign, because it is escaped. @item [a-zA-Z0-9] In the C locale, this matches any @acronym{ASCII} letters or digits. @item [^ @kbd{tab}]\+ (Here @kbd{tab} stands for a single tab character.) This matches a string of one or more characters, none of which is a space or a tab. Usually this means a word. @item ^\(.*\)\n\1$ This matches a string consisting of two equal substrings separated by a newline. @item .\@{9\@}A$ This matches nine characters followed by an @samp{A}. @item ^.\@{15\@}A This matches the start of a string that contains 16 characters, the last of which is an @samp{A}. @end table @node Common Commands @section Often-Used Commands If you use @command{sed} at all, you will quite likely want to know these commands. @table @code @item # [No addresses allowed.] @findex # (comments) @cindex Comments, in scripts The @code{#} character begins a comment; the comment continues until the next newline. @cindex Portability, comments If you are concerned about portability, be aware that some implementations of @command{sed} (which are not @sc{posix} conformant) may only support a single one-line comment, and then only when the very first character of the script is a @code{#}. @findex -n, forcing from within a script @cindex Caveat --- #n on first line Warning: if the first two characters of the @command{sed} script are @code{#n}, then the @option{-n} (no-autoprint) option is forced. If you want to put a comment in the first line of your script and that comment begins with the letter @samp{n} and you do not want this behavior, then be sure to either use a capital @samp{N}, or place at least one space before the @samp{n}. @item q [@var{exit-code}] This command only accepts a single address. @findex q (quit) command @cindex @value{SSEDEXT}, returning an exit code @cindex Quitting Exit @command{sed} without processing any more commands or input. Note that the current pattern space is printed if auto-print is not disabled with the @option{-n} options. The ability to return an exit code from the @command{sed} script is a @value{SSED} extension. @item d @findex d (delete) command @cindex Text, deleting Delete the pattern space; immediately start next cycle. @item p @findex p (print) command @cindex Text, printing Print out the pattern space (to the standard output). This command is usually only used in conjunction with the @option{-n} command-line option. @item n @findex n (next-line) command @cindex Next input line, replace pattern space with @cindex Read next input line If auto-print is not disabled, print the pattern space, then, regardless, replace the pattern space with the next line of input. If there is no more input then @command{sed} exits without processing any more commands. @item @{ @var{commands} @} @findex @{@} command grouping @cindex Grouping commands @cindex Command groups A group of commands may be enclosed between @code{@{} and @code{@}} characters. This is particularly useful when you want a group of commands to be triggered by a single address (or address-range) match. @end table @node The "s" Command @section The @code{s} Command The syntax of the @code{s} (as in substitute) command is @samp{s/@var{regexp}/@var{replacement}/@var{flags}}. The @code{/} characters may be uniformly replaced by any other single character within any given @code{s} command. The @code{/} character (or whatever other character is used in its stead) can appear in the @var{regexp} or @var{replacement} only if it is preceded by a @code{\} character. The @code{s} command is probably the most important in @command{sed} and has a lot of different options. Its basic concept is simple: the @code{s} command attempts to match the pattern space against the supplied @var{regexp}; if the match is successful, then that portion of the pattern space which was matched is replaced with @var{replacement}. @cindex Backreferences, in regular expressions @cindex Parenthesized substrings The @var{replacement} can contain @code{\@var{n}} (@var{n} being a number from 1 to 9, inclusive) references, which refer to the portion of the match which is contained between the @var{n}th @code{\(} and its matching @code{\)}. Also, the @var{replacement} can contain unescaped @code{&} characters which reference the whole matched portion of the pattern space. @cindex @value{SSEDEXT}, case modifiers in @code{s} commands Finally, as a @value{SSED} extension, you can include a special sequence made of a backslash and one of the letters @code{L}, @code{l}, @code{U}, @code{u}, or @code{E}. The meaning is as follows: @table @code @item \L Turn the replacement to lowercase until a @code{\U} or @code{\E} is found, @item \l Turn the next character to lowercase, @item \U Turn the replacement to uppercase until a @code{\L} or @code{\E} is found, @item \u Turn the next character to uppercase, @item \E Stop case conversion started by @code{\L} or @code{\U}. @end table To include a literal @code{\}, @code{&}, or newline in the final replacement, be sure to precede the desired @code{\}, @code{&}, or newline in the @var{replacement} with a @code{\}. @findex s command, option flags @cindex Substitution of text, options The @code{s} command can be followed by zero or more of the following @var{flags}: @table @code @item g @cindex Global substitution @cindex Replacing all text matching regexp in a line Apply the replacement to @emph{all} matches to the @var{regexp}, not just the first. @item @var{number} @cindex Replacing only @var{n}th match of regexp in a line Only replace the @var{number}th match of the @var{regexp}. @cindex @acronym{GNU} extensions, @code{g} and @var{number} modifier interaction in @code{s} command @cindex Mixing @code{g} and @var{number} modifiers in the @code{s} command Note: the @sc{posix} standard does not specify what should happen when you mix the @code{g} and @var{number} modifiers, and currently there is no widely agreed upon meaning across @command{sed} implementations. For @value{SSED}, the interaction is defined to be: ignore matches before the @var{number}th, and then match and replace all matches from the @var{number}th on. @item p @cindex Text, printing after substitution If the substitution was made, then print the new pattern space. Note: when both the @code{p} and @code{e} options are specified, the relative ordering of the two produces very different results. In general, @code{ep} (evaluate then print) is what you want, but operating the other way round can be useful for debugging. For this reason, the current version of @value{SSED} interprets specially the presence of @code{p} options both before and after @code{e}, printing the pattern space before and after evaluation, while in general flags for the @code{s} command show their effect just once. This behavior, although documented, might change in future versions. @item w @var{file-name} @cindex Text, writing to a file after substitution @cindex @value{SSEDEXT}, @file{/dev/stdout} file @cindex @value{SSEDEXT}, @file{/dev/stderr} file If the substitution was made, then write out the result to the named file. As a @value{SSED} extension, two special values of @var{file-name} are supported: @file{/dev/stderr}, which writes the result to the standard error, and @file{/dev/stdout}, which writes to the standard output.@footnote{This is equivalent to @code{p} unless the @option{-i} option is being used.} @item e @cindex Evaluate Bourne-shell commands, after substitution @cindex Subprocesses @cindex @value{SSEDEXT}, evaluating Bourne-shell commands @cindex @value{SSEDEXT}, subprocesses This command allows one to pipe input from a shell command into pattern space. If a substitution was made, the command that is found in pattern space is executed and pattern space is replaced with its output. A trailing newline is suppressed; results are undefined if the command to be executed contains a @sc{nul} character. This is a @value{SSED} extension. @item I @itemx i @cindex @acronym{GNU} extensions, @code{I} modifier @cindex Case-insensitive matching @ifset PERL @cindex Perl-style regular expressions, case-insensitive @end ifset The @code{I} modifier to regular-expression matching is a @acronym{GNU} extension which makes @command{sed} match @var{regexp} in a case-insensitive manner. @item M @itemx m @cindex @value{SSEDEXT}, @code{M} modifier @ifset PERL @cindex Perl-style regular expressions, multiline @end ifset The @code{M} modifier to regular-expression matching is a @value{SSED} extension which causes @code{^} and @code{$} to match respectively (in addition to the normal behavior) the empty string after a newline, and the empty string before a newline. There are special character sequences @ifset PERL (@code{\A} and @code{\Z} in Perl mode, @code{\`} and @code{\'} in basic or extended regular expression modes) @end ifset @ifclear PERL (@code{\`} and @code{\'}) @end ifclear which always match the beginning or the end of the buffer. @code{M} stands for @cite{multi-line}. @ifset PERL @item S @itemx s @cindex @value{SSEDEXT}, @code{S} modifier @cindex Perl-style regular expressions, single line The @code{S} modifier to regular-expression matching is only valid in Perl mode and specifies that the dot character (@code{.}) will match the newline character too. @code{S} stands for @cite{single-line}. @end ifset @ifset PERL @item X @itemx x @cindex @value{SSEDEXT}, @code{X} modifier @cindex Perl-style regular expressions, extended The @code{X} modifier to regular-expression matching is also valid in Perl mode only. If it is used, whitespace in the pattern (other than in a character class) and characters between a @kbd{#} outside a character class and the next newline character are ignored. An escaping backslash can be used to include a whitespace or @kbd{#} character as part of the pattern. @end ifset @end table @node Other Commands @section Less Frequently-Used Commands Though perhaps less frequently used than those in the previous section, some very small yet useful @command{sed} scripts can be built with these commands. @table @code @item y/@var{source-chars}/@var{dest-chars}/ (The @code{/} characters may be uniformly replaced by any other single character within any given @code{y} command.) @findex y (transliterate) command @cindex Transliteration Transliterate any characters in the pattern space which match any of the @var{source-chars} with the corresponding character in @var{dest-chars}. Instances of the @code{/} (or whatever other character is used in its stead), @code{\}, or newlines can appear in the @var{source-chars} or @var{dest-chars} lists, provide that each instance is escaped by a @code{\}. The @var{source-chars} and @var{dest-chars} lists @emph{must} contain the same number of characters (after de-escaping). @item a\ @itemx @var{text} @cindex @value{SSEDEXT}, two addresses supported by most commands As a @acronym{GNU} extension, this command accepts two addresses. @findex a (append text lines) command @cindex Appending text after a line @cindex Text, appending Queue the lines of text which follow this command (each but the last ending with a @code{\}, which are removed from the output) to be output at the end of the current cycle, or when the next input line is read. Escape sequences in @var{text} are processed, so you should use @code{\\} in @var{text} to print a single backslash. As a @acronym{GNU} extension, if between the @code{a} and the newline there is other than a whitespace-@code{\} sequence, then the text of this line, starting at the first non-whitespace character after the @code{a}, is taken as the first line of the @var{text} block. (This enables a simplification in scripting a one-line add.) This extension also works with the @code{i} and @code{c} commands. @item i\ @itemx @var{text} @cindex @value{SSEDEXT}, two addresses supported by most commands As a @acronym{GNU} extension, this command accepts two addresses. @findex i (insert text lines) command @cindex Inserting text before a line @cindex Text, insertion Immediately output the lines of text which follow this command (each but the last ending with a @code{\}, which are removed from the output). @item c\ @itemx @var{text} @findex c (change to text lines) command @cindex Replacing selected lines with other text Delete the lines matching the address or address-range, and output the lines of text which follow this command (each but the last ending with a @code{\}, which are removed from the output) in place of the last line (or in place of each line, if no addresses were specified). A new cycle is started after this command is done, since the pattern space will have been deleted. @item = @cindex @value{SSEDEXT}, two addresses supported by most commands As a @acronym{GNU} extension, this command accepts two addresses. @findex = (print line number) command @cindex Printing line number @cindex Line number, printing Print out the current input line number (with a trailing newline). @item l @var{n} @findex l (list unambiguously) command @cindex List pattern space @cindex Printing text unambiguously @cindex Line length, setting @cindex @value{SSEDEXT}, setting line length Print the pattern space in an unambiguous form: non-printable characters (and the @code{\} character) are printed in C-style escaped form; long lines are split, with a trailing @code{\} character to indicate the split; the end of each line is marked with a @code{$}. @var{n} specifies the desired line-wrap length; a length of 0 (zero) means to never wrap long lines. If omitted, the default as specified on the command line is used. The @var{n} parameter is a @value{SSED} extension. @item r @var{filename} @cindex @value{SSEDEXT}, two addresses supported by most commands As a @acronym{GNU} extension, this command accepts two addresses. @findex r (read file) command @cindex Read text from a file @cindex @value{SSEDEXT}, @file{/dev/stdin} file Queue the contents of @var{filename} to be read and inserted into the output stream at the end of the current cycle, or when the next input line is read. Note that if @var{filename} cannot be read, it is treated as if it were an empty file, without any error indication. As a @value{SSED} extension, the special value @file{/dev/stdin} is supported for the file name, which reads the contents of the standard input. @item w @var{filename} @findex w (write file) command @cindex Write to a file @cindex @value{SSEDEXT}, @file{/dev/stdout} file @cindex @value{SSEDEXT}, @file{/dev/stderr} file Write the pattern space to @var{filename}. As a @value{SSED} extension, two special values of @var{file-name} are supported: @file{/dev/stderr}, which writes the result to the standard error, and @file{/dev/stdout}, which writes to the standard output.@footnote{This is equivalent to @code{p} unless the @option{-i} option is being used.} The file will be created (or truncated) before the first input line is read; all @code{w} commands (including instances of @code{w} flag on successful @code{s} commands) which refer to the same @var{filename} are output without closing and reopening the file. @item D @findex D (delete first line) command @cindex Delete first line from pattern space Delete text in the pattern space up to the first newline. If any text is left, restart cycle with the resultant pattern space (without reading a new line of input), otherwise start a normal new cycle. @item N @findex N (append Next line) command @cindex Next input line, append to pattern space @cindex Append next input line to pattern space Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then @command{sed} exits without processing any more commands. @item P @findex P (print first line) command @cindex Print first line from pattern space Print out the portion of the pattern space up to the first newline. @item h @findex h (hold) command @cindex Copy pattern space into hold space @cindex Replace hold space with copy of pattern space @cindex Hold space, copying pattern space into Replace the contents of the hold space with the contents of the pattern space. @item H @findex H (append Hold) command @cindex Append pattern space to hold space @cindex Hold space, appending from pattern space Append a newline to the contents of the hold space, and then append the contents of the pattern space to that of the hold space. @item g @findex g (get) command @cindex Copy hold space into pattern space @cindex Replace pattern space with copy of hold space @cindex Hold space, copy into pattern space Replace the contents of the pattern space with the contents of the hold space. @item G @findex G (appending Get) command @cindex Append hold space to pattern space @cindex Hold space, appending to pattern space Append a newline to the contents of the pattern space, and then append the contents of the hold space to that of the pattern space. @item x @findex x (eXchange) command @cindex Exchange hold space with pattern space @cindex Hold space, exchange with pattern space Exchange the contents of the hold and pattern spaces. @end table @node Programming Commands @section Commands for @command{sed} gurus In most cases, use of these commands indicates that you are probably better off programming in something like @command{awk} or Perl. But occasionally one is committed to sticking with @command{sed}, and these commands can enable one to write quite convoluted scripts. @cindex Flow of control in scripts @table @code @item : @var{label} [No addresses allowed.] @findex : (label) command @cindex Labels, in scripts Specify the location of @var{label} for branch commands. In all other respects, a no-op. @item b @var{label} @findex b (branch) command @cindex Branch to a label, unconditionally @cindex Goto, in scripts Unconditionally branch to @var{label}. The @var{label} may be omitted, in which case the next cycle is started. @item t @var{label} @findex t (test and branch if successful) command @cindex Branch to a label, if @code{s///} succeeded @cindex Conditional branch Branch to @var{label} only if there has been a successful @code{s}ubstitution since the last input line was read or conditional branch was taken. The @var{label} may be omitted, in which case the next cycle is started. @end table @node Extended Commands @section Commands Specific to @value{SSED} These commands are specific to @value{SSED}, so you must use them with care and only when you are sure that hindering portability is not evil. They allow you to check for @value{SSED} extensions or to do tasks that are required quite often, yet are unsupported by standard @command{sed}s. @table @code @item e [@var{command}] @findex e (evaluate) command @cindex Evaluate Bourne-shell commands @cindex Subprocesses @cindex @value{SSEDEXT}, evaluating Bourne-shell commands @cindex @value{SSEDEXT}, subprocesses This command allows one to pipe input from a shell command into pattern space. Without parameters, the @code{e} command executes the command that is found in pattern space and replaces the pattern space with the output; a trailing newline is suppressed. If a parameter is specified, instead, the @code{e} command interprets it as a command and sends its output to the output stream (like @code{r} does). The command can run across multiple lines, all but the last ending with a back-slash. In both cases, the results are undefined if the command to be executed contains a @sc{nul} character. @item L @var{n} @findex L (fLow paragraphs) command @cindex Reformat pattern space @cindex Reformatting paragraphs @cindex @value{SSEDEXT}, reformatting paragraphs @cindex @value{SSEDEXT}, @code{L} command This @value{SSED} extension fills and joins lines in pattern space to produce output lines of (at most) @var{n} characters, like @code{fmt} does; if @var{n} is omitted, the default as specified on the command line is used. This command is considered a failed experiment and unless there is enough request (which seems unlikely) will be removed in future versions. @ignore Blank lines, spaces between words, and indentation are preserved in the output; successive input lines with different indentation are not joined; tabs are expanded to 8 columns. If the pattern space contains multiple lines, they are joined, but since the pattern space usually contains a single line, the behavior of a simple @code{L;d} script is the same as @samp{fmt -s} (i.e., it does not join short lines to form longer ones). @var{n} specifies the desired line-wrap length; if omitted, the default as specified on the command line is used. @end ignore @item Q [@var{exit-code}] This command only accepts a single address. @findex Q (silent Quit) command @cindex @value{SSEDEXT}, quitting silently @cindex @value{SSEDEXT}, returning an exit code @cindex Quitting This command is the same as @code{q}, but will not print the contents of pattern space. Like @code{q}, it provides the ability to return an exit code to the caller. This command can be useful because the only alternative ways to accomplish this apparently trivial function are to use the @option{-n} option (which can unnecessarily complicate your script) or resorting to the following snippet, which wastes time by reading the whole file without any visible effect: @example :eat $d @i{Quit silently on the last line} N @i{Read another line, silently} g @i{Overwrite pattern space each time to save memory} b eat @end example @item R @var{filename} @findex R (read line) command @cindex Read text from a file @cindex @value{SSEDEXT}, reading a file a line at a time @cindex @value{SSEDEXT}, @code{R} command @cindex @value{SSEDEXT}, @file{/dev/stdin} file Queue a line of @var{filename} to be read and inserted into the output stream at the end of the current cycle, or when the next input line is read. Note that if @var{filename} cannot be read, or if its end is reached, no line is appended, without any error indication. As with the @code{r} command, the special value @file{/dev/stdin} is supported for the file name, which reads a line from the standard input. @item T @var{label} @findex T (test and branch if failed) command @cindex @value{SSEDEXT}, branch if @code{s///} failed @cindex Branch to a label, if @code{s///} failed @cindex Conditional branch Branch to @var{label} only if there have been no successful @code{s}ubstitutions since the last input line was read or conditional branch was taken. The @var{label} may be omitted, in which case the next cycle is started. @item v @var{version} @findex v (version) command @cindex @value{SSEDEXT}, checking for their presence @cindex Requiring @value{SSED} This command does nothing, but makes @command{sed} fail if @value{SSED} extensions are not supported, simply because other versions of @command{sed} do not implement it. In addition, you can specify the version of @command{sed} that your script requires, such as @code{4.0.5}. The default is @code{4.0} because that is the first version that implemented this command. This command enables all @value{SSEDEXT} even if @env{POSIXLY_CORRECT} is set in the environment. @item W @var{filename} @findex W (write first line) command @cindex Write first line to a file @cindex @value{SSEDEXT}, writing first line to a file Write to the given filename the portion of the pattern space up to the first newline. Everything said under the @code{w} command about file handling holds here too. @end table @node Escapes @section @acronym{GNU} Extensions for Escapes in Regular Expressions @cindex @acronym{GNU} extensions, special escapes Until this chapter, we have only encountered escapes of the form @samp{\^}, which tell @command{sed} not to interpret the circumflex as a special character, but rather to take it literally. For example, @samp{\*} matches a single asterisk rather than zero or more backslashes. @cindex @code{POSIXLY_CORRECT} behavior, escapes This chapter introduces another kind of escape@footnote{All the escapes introduced here are @acronym{GNU} extensions, with the exception of @code{\n}. In basic regular expression mode, setting @code{POSIXLY_CORRECT} disables them inside bracket expressions.}---that is, escapes that are applied to a character or sequence of characters that ordinarily are taken literally, and that @command{sed} replaces with a special character. This provides a way of encoding non-printable characters in patterns in a visible manner. There is no restriction on the appearance of non-printing characters in a @command{sed} script but when a script is being prepared in the shell or by text editing, it is usually easier to use one of the following escape sequences than the binary character it represents: The list of these escapes is: @table @code @item \a Produces or matches a @sc{bel} character, that is an ``alert'' (@sc{ascii} 7). @item \f Produces or matches a form feed (@sc{ascii} 12). @item \n Produces or matches a newline (@sc{ascii} 10). @item \r Produces or matches a carriage return (@sc{ascii} 13). @item \t Produces or matches a horizontal tab (@sc{ascii} 9). @item \v Produces or matches a so called ``vertical tab'' (@sc{ascii} 11). @item \c@var{x} Produces or matches @kbd{@sc{Control}-@var{x}}, where @var{x} is any character. The precise effect of @samp{\c@var{x}} is as follows: if @var{x} is a lower case letter, it is converted to upper case. Then bit 6 of the character (hex 40) is inverted. Thus @samp{\cz} becomes hex 1A, but @samp{\c@{} becomes hex 3B, while @samp{\c;} becomes hex 7B. @item \d@var{xxx} Produces or matches a character whose decimal @sc{ascii} value is @var{xxx}. @item \o@var{xxx} @ifset PERL @item \@var{xxx} @end ifset Produces or matches a character whose octal @sc{ascii} value is @var{xxx}. @ifset PERL The syntax without the @code{o} is active in Perl mode, while the one with the @code{o} is active in the normal or extended @sc{posix} regular expression modes. @end ifset @item \x@var{xx} Produces or matches a character whose hexadecimal @sc{ascii} value is @var{xx}. @end table @samp{\b} (backspace) was omitted because of the conflict with the existing ``word boundary'' meaning. Other escapes match a particular character class and are valid only in regular expressions: @table @code @item \w Matches any ``word'' character. A ``word'' character is any letter or digit or the underscore character. @item \W Matches any ``non-word'' character. @item \b Matches a word boundary; that is it matches if the character to the left is a ``word'' character and the character to the right is a ``non-word'' character, or vice-versa. @item \B Matches everywhere but on a word boundary; that is it matches if the character to the left and the character to the right are either both ``word'' characters or both ``non-word'' characters. @item \` Matches only at the start of pattern space. This is different from @code{^} in multi-line mode. @item \' Matches only at the end of pattern space. This is different from @code{$} in multi-line mode. @ifset PERL @item \G Match only at the start of pattern space or, when doing a global substitution using the @code{s///g} command and option, at the end-of-match position of the prior match. For example, @samp{s/\Ga/Z/g} will change an initial run of @code{a}s to a run of @code{Z}s @end ifset @end table @node Examples @chapter Some Sample Scripts Here are some @command{sed} scripts to guide you in the art of mastering @command{sed}. @menu Some exotic examples: * Centering lines:: * Increment a number:: * Rename files to lower case:: * Print bash environment:: * Reverse chars of lines:: Emulating standard utilities: * tac:: Reverse lines of files * cat -n:: Numbering lines * cat -b:: Numbering non-blank lines * wc -c:: Counting chars * wc -w:: Counting words * wc -l:: Counting lines * head:: Printing the first lines * tail:: Printing the last lines * uniq:: Make duplicate lines unique * uniq -d:: Print duplicated lines of input * uniq -u:: Remove all duplicated lines * cat -s:: Squeezing blank lines @end menu @node Centering lines @section Centering Lines This script centers all lines of a file on a 80 columns width. To change that width, the number in @code{\@{@dots{}\@}} must be replaced, and the number of added spaces also must be changed. Note how the buffer commands are used to separate parts in the regular expressions to be matched---this is a common technique. @c start------------------------------------------- @example #!/usr/bin/sed -f # Put 80 spaces in the buffer 1 @{ x s/^$/ / s/^.*$/&&&&&&&&/ x @} # del leading and trailing spaces y/@kbd{tab}/ / s/^ *// s/ *$// # add a newline and 80 spaces to end of line G # keep first 81 chars (80 + a newline) s/^\(.\@{81\@}\).*$/\1/ # \2 matches half of the spaces, which are moved to the beginning s/^\(.*\)\n\(.*\)\2/\2\1/ @end example @c end--------------------------------------------- @node Increment a number @section Increment a Number This script is one of a few that demonstrate how to do arithmetic in @command{sed}. This is indeed possible,@footnote{@command{sed} guru Greg Ubben wrote an implementation of the @command{dc} @sc{rpn} calculator! It is distributed together with sed.} but must be done manually. To increment one number you just add 1 to last digit, replacing it by the following digit. There is one exception: when the digit is a nine the previous digits must be also incremented until you don't have a nine. This solution by Bruno Haible is very clever and smart because it uses a single buffer; if you don't have this limitation, the algorithm used in @ref{cat -n, Numbering lines}, is faster. It works by replacing trailing nines with an underscore, then using multiple @code{s} commands to increment the last digit, and then again substituting underscores with zeros. @c start------------------------------------------- @example #!/usr/bin/sed -f /[^0-9]/ d # replace all leading 9s by _ (any other character except digits, could # be used) :d s/9\(_*\)$/_\1/ td # incr last digit only. The first line adds a most-significant # digit of 1 if we have to add a digit. # # The @code{tn} commands are not necessary, but make the thing # faster s/^\(_*\)$/1\1/; tn s/8\(_*\)$/9\1/; tn s/7\(_*\)$/8\1/; tn s/6\(_*\)$/7\1/; tn s/5\(_*\)$/6\1/; tn s/4\(_*\)$/5\1/; tn s/3\(_*\)$/4\1/; tn s/2\(_*\)$/3\1/; tn s/1\(_*\)$/2\1/; tn s/0\(_*\)$/1\1/; tn :n y/_/0/ @end example @c end--------------------------------------------- @node Rename files to lower case @section Rename Files to Lower Case This is a pretty strange use of @command{sed}. We transform text, and transform it to be shell commands, then just feed them to shell. Don't worry, even worse hacks are done when using @command{sed}; I have seen a script converting the output of @command{date} into a @command{bc} program! The main body of this is the @command{sed} script, which remaps the name from lower to upper (or vice-versa) and even checks out if the remapped name is the same as the original name. Note how the script is parameterized using shell variables and proper quoting. @c start------------------------------------------- @example #! /bin/sh # rename files to lower/upper case... # # usage: # move-to-lower * # move-to-upper * # or # move-to-lower -R . # move-to-upper -R . # help() @{ cat << eof Usage: $0 [-n] [-r] [-h] files... -n do nothing, only see what would be done -R recursive (use find) -h this message files files to remap to lower case Examples: $0 -n * (see if everything is ok, then...) $0 * $0 -R . eof @} apply_cmd='sh' finder='echo "$@@" | tr " " "\n"' files_only= while : do case "$1" in -n) apply_cmd='cat' ;; -R) finder='find "$@@" -type f';; -h) help ; exit 1 ;; *) break ;; esac shift done if [ -z "$1" ]; then echo Usage: $0 [-h] [-n] [-r] files... exit 1 fi LOWER='abcdefghijklmnopqrstuvwxyz' UPPER='ABCDEFGHIJKLMNOPQRSTUVWXYZ' case `basename $0` in *upper*) TO=$UPPER; FROM=$LOWER ;; *) FROM=$UPPER; TO=$LOWER ;; esac eval $finder | sed -n ' # remove all trailing slashes s/\/*$// # add ./ if there is no path, only a filename /\//! s/^/.\// # save path+filename h # remove path s/.*\/// # do conversion only on filename y/'$FROM'/'$TO'/ # now line contains original path+file, while # hold space contains the new filename x # add converted file name to line, which now contains # path/file-name\nconverted-file-name G # check if converted file name is equal to original file name, # if it is, do not print nothing /^.*\/\(.*\)\n\1/b # now, transform path/fromfile\n, into # mv path/fromfile path/tofile and print it s/^\(.*\/\)\(.*\)\n\(.*\)$/mv \1\2 \1\3/p ' | $apply_cmd @end example @c end--------------------------------------------- @node Print bash environment @section Print @command{bash} Environment This script strips the definition of the shell functions from the output of the @command{set} Bourne-shell command. @c start------------------------------------------- @example #!/bin/sh set | sed -n ' :x @ifinfo # if no occurrence of "=()" print and load next line @end ifinfo @ifnotinfo # if no occurrence of @samp{=()} print and load next line @end ifnotinfo /=()/! @{ p; b; @} / () $/! @{ p; b; @} # possible start of functions section # save the line in case this is a var like FOO="() " h # if the next line has a brace, we quit because # nothing comes after functions n /^@{/ q # print the old line x; p # work on the new line now x; bx ' @end example @c end--------------------------------------------- @node Reverse chars of lines @section Reverse Characters of Lines This script can be used to reverse the position of characters in lines. The technique moves two characters at a time, hence it is faster than more intuitive implementations. Note the @code{tx} command before the definition of the label. This is often needed to reset the flag that is tested by the @code{t} command. Imaginative readers will find uses for this script. An example is reversing the output of @command{banner}.@footnote{This requires another script to pad the output of banner; for example @example #! /bin/sh banner -w $1 $2 $3 $4 | sed -e :a -e '/^.\@{0,'$1'\@}$/ @{ s/$/ /; ba; @}' | ~/sedscripts/reverseline.sed @end example } @c start------------------------------------------- @example #!/usr/bin/sed -f /../! b # Reverse a line. Begin embedding the line between two newlines s/^.*$/\ &\ / # Move first character at the end. The regexp matches until # there are zero or one characters between the markers tx :x s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/ tx # Remove the newline markers s/\n//g @end example @c end--------------------------------------------- @node tac @section Reverse Lines of Files This one begins a series of totally useless (yet interesting) scripts emulating various Unix commands. This, in particular, is a @command{tac} workalike. Note that on implementations other than @acronym{GNU} @command{sed} @ifset PERL and @value{SSED} @end ifset this script might easily overflow internal buffers. @c start------------------------------------------- @example #!/usr/bin/sed -nf # reverse all lines of input, i.e. first line became last, ... # from the second line, the buffer (which contains all previous lines) # is *appended* to current line, so, the order will be reversed 1! G # on the last line we're done -- print everything $ p # store everything on the buffer again h @end example @c end--------------------------------------------- @node cat -n @section Numbering Lines This script replaces @samp{cat -n}; in fact it formats its output exactly like @acronym{GNU} @command{cat} does. Of course this is completely useless and for two reasons: first, because somebody else did it in C, second, because the following Bourne-shell script could be used for the same purpose and would be much faster: @c start------------------------------------------- @example #! /bin/sh sed -e "=" $@@ | sed -e ' s/^/ / N s/^ *\(......\)\n/\1 / ' @end example @c end--------------------------------------------- It uses @command{sed} to print the line number, then groups lines two by two using @code{N}. Of course, this script does not teach as much as the one presented below. The algorithm used for incrementing uses both buffers, so the line is printed as soon as possible and then discarded. The number is split so that changing digits go in a buffer and unchanged ones go in the other; the changed digits are modified in a single step (using a @code{y} command). The line number for the next line is then composed and stored in the hold space, to be used in the next iteration. @c start------------------------------------------- @example #!/usr/bin/sed -nf # Prime the pump on the first line x /^$/ s/^.*$/1/ # Add the correct line number before the pattern G h # Format it and print it s/^/ / s/^ *\(......\)\n/\1 /p # Get the line number from hold space; add a zero # if we're going to add a digit on the next line g s/\n.*$// /^9*$/ s/^/0/ # separate changing/unchanged digits with an x s/.9*$/x&/ # keep changing digits in hold space h s/^.*x// y/0123456789/1234567890/ x # keep unchanged digits in pattern space s/x.*$// # compose the new number, remove the newline implicitly added by G G s/\n// h @end example @c end--------------------------------------------- @node cat -b @section Numbering Non-blank Lines Emulating @samp{cat -b} is almost the same as @samp{cat -n}---we only have to select which lines are to be numbered and which are not. The part that is common to this script and the previous one is not commented to show how important it is to comment @command{sed} scripts properly... @c start------------------------------------------- @example #!/usr/bin/sed -nf /^$/ @{ p b @} # Same as cat -n from now x /^$/ s/^.*$/1/ G h s/^/ / s/^ *\(......\)\n/\1 /p x s/\n.*$// /^9*$/ s/^/0/ s/.9*$/x&/ h s/^.*x// y/0123456789/1234567890/ x s/x.*$// G s/\n// h @end example @c end--------------------------------------------- @node wc -c @section Counting Characters This script shows another way to do arithmetic with @command{sed}. In this case we have to add possibly large numbers, so implementing this by successive increments would not be feasible (and possibly even more complicated to contrive than this script). The approach is to map numbers to letters, kind of an abacus implemented with @command{sed}. @samp{a}s are units, @samp{b}s are tenths and so on: we simply add the number of characters on the current line as units, and then propagate the carry to tenths, hundredths, and so on. As usual, running totals are kept in hold space. On the last line, we convert the abacus form back to decimal. For the sake of variety, this is done with a loop rather than with some 80 @code{s} commands@footnote{Some implementations have a limit of 199 commands per script}: first we convert units, removing @samp{a}s from the number; then we rotate letters so that tenths become @samp{a}s, and so on until no more letters remain. @c start------------------------------------------- @example #!/usr/bin/sed -nf # Add n+1 a's to hold space (+1 is for the newline) s/./a/g H x s/\n/a/ # Do the carry. The t's and b's are not necessary, # but they do speed up the thing t a : a; s/aaaaaaaaaa/b/g; t b; b done : b; s/bbbbbbbbbb/c/g; t c; b done : c; s/cccccccccc/d/g; t d; b done : d; s/dddddddddd/e/g; t e; b done : e; s/eeeeeeeeee/f/g; t f; b done : f; s/ffffffffff/g/g; t g; b done : g; s/gggggggggg/h/g; t h; b done : h; s/hhhhhhhhhh//g : done $! @{ h b @} # On the last line, convert back to decimal : loop /a/! s/[b-h]*/&0/ s/aaaaaaaaa/9/ s/aaaaaaaa/8/ s/aaaaaaa/7/ s/aaaaaa/6/ s/aaaaa/5/ s/aaaa/4/ s/aaa/3/ s/aa/2/ s/a/1/ : next y/bcdefgh/abcdefg/ /[a-h]/ b loop p @end example @c end--------------------------------------------- @node wc -w @section Counting Words This script is almost the same as the previous one, once each of the words on the line is converted to a single @samp{a} (in the previous script each letter was changed to an @samp{a}). It is interesting that real @command{wc} programs have optimized loops for @samp{wc -c}, so they are much slower at counting words rather than characters. This script's bottleneck, instead, is arithmetic, and hence the word-counting one is faster (it has to manage smaller numbers). Again, the common parts are not commented to show the importance of commenting @command{sed} scripts. @c start------------------------------------------- @example #!/usr/bin/sed -nf # Convert words to a's s/[ @kbd{tab}][ @kbd{tab}]*/ /g s/^/ / s/ [^ ][^ ]*/a /g s/ //g # Append them to hold space H x s/\n// # From here on it is the same as in wc -c. /aaaaaaaaaa/! bx; s/aaaaaaaaaa/b/g /bbbbbbbbbb/! bx; s/bbbbbbbbbb/c/g /cccccccccc/! bx; s/cccccccccc/d/g /dddddddddd/! bx; s/dddddddddd/e/g /eeeeeeeeee/! bx; s/eeeeeeeeee/f/g /ffffffffff/! bx; s/ffffffffff/g/g /gggggggggg/! bx; s/gggggggggg/h/g s/hhhhhhhhhh//g :x $! @{ h; b; @} :y /a/! s/[b-h]*/&0/ s/aaaaaaaaa/9/ s/aaaaaaaa/8/ s/aaaaaaa/7/ s/aaaaaa/6/ s/aaaaa/5/ s/aaaa/4/ s/aaa/3/ s/aa/2/ s/a/1/ y/bcdefgh/abcdefg/ /[a-h]/ by p @end example @c end--------------------------------------------- @node wc -l @section Counting Lines No strange things are done now, because @command{sed} gives us @samp{wc -l} functionality for free!!! Look: @c start------------------------------------------- @example #!/usr/bin/sed -nf $= @end example @c end--------------------------------------------- @node head @section Printing the First Lines This script is probably the simplest useful @command{sed} script. It displays the first 10 lines of input; the number of displayed lines is right before the @code{q} command. @c start------------------------------------------- @example #!/usr/bin/sed -f 10q @end example @c end--------------------------------------------- @node tail @section Printing the Last Lines Printing the last @var{n} lines rather than the first is more complex but indeed possible. @var{n} is encoded in the second line, before the bang character. This script is similar to the @command{tac} script in that it keeps the final output in the hold space and prints it at the end: @c start------------------------------------------- @example #!/usr/bin/sed -nf 1! @{; H; g; @} 1,10 !s/[^\n]*\n// $p h @end example @c end--------------------------------------------- Mainly, the scripts keeps a window of 10 lines and slides it by adding a line and deleting the oldest (the substitution command on the second line works like a @code{D} command but does not restart the loop). The ``sliding window'' technique is a very powerful way to write efficient and complex @command{sed} scripts, because commands like @code{P} would require a lot of work if implemented manually. To introduce the technique, which is fully demonstrated in the rest of this chapter and is based on the @code{N}, @code{P} and @code{D} commands, here is an implementation of @command{tail} using a simple ``sliding window.'' This looks complicated but in fact the working is the same as the last script: after we have kicked in the appropriate number of lines, however, we stop using the hold space to keep inter-line state, and instead use @code{N} and @code{D} to slide pattern space by one line: @c start------------------------------------------- @example #!/usr/bin/sed -f 1h 2,10 @{; H; g; @} $q 1,9d N D @end example @c end--------------------------------------------- @node uniq @section Make Duplicate Lines Unique This is an example of the art of using the @code{N}, @code{P} and @code{D} commands, probably the most difficult to master. @c start------------------------------------------- @example #!/usr/bin/sed -f h :b # On the last line, print and exit $b N /^\(.*\)\n\1$/ @{ # The two lines are identical. Undo the effect of # the n command. g bb @} # If the @code{N} command had added the last line, print and exit $b # The lines are different; print the first and go # back working on the second. P D @end example @c end--------------------------------------------- As you can see, we mantain a 2-line window using @code{P} and @code{D}. This technique is often used in advanced @command{sed} scripts. @node uniq -d @section Print Duplicated Lines of Input This script prints only duplicated lines, like @samp{uniq -d}. @c start------------------------------------------- @example #!/usr/bin/sed -nf $b N /^\(.*\)\n\1$/ @{ # Print the first of the duplicated lines s/.*\n// p # Loop until we get a different line :b $b N /^\(.*\)\n\1$/ @{ s/.*\n// bb @} @} # The last line cannot be followed by duplicates $b # Found a different one. Leave it alone in the pattern space # and go back to the top, hunting its duplicates D @end example @c end--------------------------------------------- @node uniq -u @section Remove All Duplicated Lines This script prints only unique lines, like @samp{uniq -u}. @c start------------------------------------------- @example #!/usr/bin/sed -f # Search for a duplicate line --- until that, print what you find. $b N /^\(.*\)\n\1$/ ! @{ P D @} :c # Got two equal lines in pattern space. At the # end of the file we simply exit $d # Else, we keep reading lines with @code{N} until we # find a different one s/.*\n// N /^\(.*\)\n\1$/ @{ bc @} # Remove the last instance of the duplicate line # and go back to the top D @end example @c end--------------------------------------------- @node cat -s @section Squeezing Blank Lines As a final example, here are three scripts, of increasing complexity and speed, that implement the same function as @samp{cat -s}, that is squeezing blank lines. The first leaves a blank line at the beginning and end if there are some already. @c start------------------------------------------- @example #!/usr/bin/sed -f # on empty lines, join with next # Note there is a star in the regexp :x /^\n*$/ @{ N bx @} # now, squeeze all '\n', this can be also done by: # s/^\(\n\)*/\1/ s/\n*/\ / @end example @c end--------------------------------------------- This one is a bit more complex and removes all empty lines at the beginning. It does leave a single blank line at end if one was there. @c start------------------------------------------- @example #!/usr/bin/sed -f # delete all leading empty lines 1,/^./@{ /./!d @} # on an empty line we remove it and all the following # empty lines, but one :x /./!@{ N s/^\n$// tx @} @end example @c end--------------------------------------------- This removes leading and trailing blank lines. It is also the fastest. Note that loops are completely done with @code{n} and @code{b}, without exploting the fact that @command{sed} cycles back to the top of the script automatically at the end of a line. @c start------------------------------------------- @example #!/usr/bin/sed -nf # delete all (leading) blanks /./!d # get here: so there is a non empty :x # print it p # get next n # got chars? print it again, etc... /./bx # no, don't have chars: got an empty line :z # get next, if last line we finish here so no trailing # empty lines are written n # also empty? then ignore it, and get next... this will # remove ALL empty lines /./!bz # all empty lines were deleted/ignored, but we have a non empty. As # what we want to do is to squeeze, insert a blank line artificially i\ bx @end example @c end--------------------------------------------- @node Limitations @chapter @value{SSED}'s Limitations and Non-limitations @cindex @acronym{GNU} extensions, unlimited line length @cindex Portability, line length limitations For those who want to write portable @command{sed} scripts, be aware that some implementations have been known to limit line lengths (for the pattern and hold spaces) to be no more than 4000 bytes. The @sc{posix} standard specifies that conforming @command{sed} implementations shall support at least 8192 byte line lengths. @value{SSED} has no built-in limit on line length; as long as it can @code{malloc()} more (virtual) memory, you can feed or construct lines as long as you like. However, recursion is used to handle subpatterns and indefinite repetition. This means that the available stack space may limit the size of the buffer that can be processed by certain patterns. @ifset PERL There are some size limitations in the regular expression matcher but it is hoped that they will never in practice be relevant. The maximum length of a compiled pattern is 65539 (sic) bytes. All values in repeating quantifiers must be less than 65536. The maximum nesting depth of all parenthesized subpatterns, including capturing and non-capturing subpatterns@footnote{The distinction is meaningful when referring to Perl-style regular expressions.}, assertions, and other types of subpattern, is 200. Also, @value{SSED} recognizes the @sc{posix} syntax @code{[.@var{ch}.]} and @code{[=@var{ch}=]} where @var{ch} is a ``collating element'', but these are not supported, and an error is given if they are encountered. Here are a few distinctions between the real Perl-style regular expressions and those that @option{-R} recognizes. @enumerate @item Lookahead assertions do not allow repeat quantifiers after them Perl permits them, but they do not mean what you might think. For example, @samp{(?!a)@{3@}} does not assert that the next three characters are not @samp{a}. It just asserts three times that the next character is not @samp{a} --- a waste of time and nothing else. @item Capturing subpatterns that occur inside negative lookahead head assertions are counted, but their entries are counted as empty in the second half of an @code{s} command. Perl sets its numerical variables from any such patterns that are matched before the assertion fails to match something (thereby succeeding), but only if the negative lookahead assertion contains just one branch. @item The following Perl escape sequences are not supported: @samp{\l}, @samp{\u}, @samp{\L}, @samp{\U}, @samp{\E}, @samp{\Q}. In fact these are implemented by Perl's general string-handling and are not part of its pattern matching engine. @item The Perl @samp{\G} assertion is not supported as it is not relevant to single pattern matches. @item Fairly obviously, @value{SSED} does not support the @samp{(?@{code@})} and @samp{(?p@{code@})} constructions. However, there is some experimental support for recursive patterns using the non-Perl item @samp{(?R)}. @item There are at the time of writing some oddities in Perl 5.005_02 concerned with the settings of captured strings when part of a pattern is repeated. For example, matching @samp{aba} against the pattern @samp{/^(a(b)?)+$/} sets @samp{$2}@footnote{@samp{$2} would be @samp{\2} in @value{SSED}.} to the value @samp{b}, but matching @samp{aabbaa} against @samp{/^(aa(bb)?)+$/} leaves @samp{$2} unset. However, if the pattern is changed to @samp{/^(aa(b(b))?)+$/} then @samp{$2} (and @samp{$3}) are set. In Perl 5.004 @samp{$2} is set in both cases, and that is also true of @value{SSED}. @item Another as yet unresolved discrepancy is that in Perl 5.005_02 the pattern @samp{/^(a)?(?(1)a|b)+$/} matches the string @samp{a}, whereas in @value{SSED} it does not. However, in both Perl and @value{SSED} @samp{/^(a)?a/} matched against @samp{a} leaves $1 unset. @end enumerate @end ifset @node Other Resources @chapter Other Resources for Learning About @command{sed} @cindex Additional reading about @command{sed} In addition to several books that have been written about @command{sed} (either specifically or as chapters in books which discuss shell programming), one can find out more about @command{sed} (including suggestions of a few books) from the FAQ for the @code{sed-users} mailing list, available from any of: @display @uref{http://www.student.northpark.edu/pemente/sed/sedfaq.html} @uref{http://sed.sf.net/grabbag/tutorials/sedfaq.html} @end display Also of interest are @uref{http://www.student.northpark.edu/pemente/sed/index.htm} and @uref{http://sed.sf.net/grabbag}, which include @command{sed} tutorials and other @command{sed}-related goodies. The @code{sed-users} mailing list itself maintained by Sven Guckes. To subscribe, visit @uref{http://groups.yahoo.com} and search for the @code{sed-users} mailing list. @node Reporting Bugs @chapter Reporting Bugs @cindex Bugs, reporting Email bug reports to @email{bonzini@@gnu.org}. Be sure to include the word ``sed'' somewhere in the @code{Subject:} field. Also, please include the output of @samp{sed --version} in the body of your report if at all possible. Please do not send a bug report like this: @example @i{while building frobme-1.3.4} $ configure @error{} sed: file sedscr line 1: Unknown option to 's' @end example If @value{SSED} doesn't configure your favorite package, take a few extra minutes to identify the specific problem and make a stand-alone test case. Unlike other programs such as C compilers, making such test cases for @command{sed} is quite simple. A stand-alone test case includes all the data necessary to perform the test, and the specific invocation of @command{sed} that causes the problem. The smaller a stand-alone test case is, the better. A test case should not involve something as far removed from @command{sed} as ``try to configure frobme-1.3.4''. Yes, that is in principle enough information to look for the bug, but that is not a very practical prospect. Here are a few commonly reported bugs that are not bugs. @table @asis @item @code{N} command on the last line @cindex Portability, @code{N} command on the last line @cindex Non-bugs, @code{N} command on the last line Most versions of @command{sed} exit without printing anything when the @command{N} command is issued on the last line of a file. @value{SSED} prints pattern space before exiting unless of course the @command{-n} command switch has been specified. This choice is by design. For example, the behavior of @example sed N foo bar @end example @noindent would depend on whether foo has an even or an odd number of lines@footnote{which is the actual ``bug'' that prompted the change in behavior}. Or, when writing a script to read the next few lines following a pattern match, traditional implementations of @code{sed} would force you to write something like @example /foo/@{ $!N; $!N; $!N; $!N; $!N; $!N; $!N; $!N; $!N @} @end example @noindent instead of just @example /foo/@{ N;N;N;N;N;N;N;N;N; @} @end example @cindex @code{POSIXLY_CORRECT} behavior, @code{N} command In any case, the simplest workaround is to use @code{$d;N} in scripts that rely on the traditional behavior, or to set the @code{POSIXLY_CORRECT} variable to a non-empty value. @item Regex syntax clashes (problems with backslashes) @cindex @acronym{GNU} extensions, to basic regular expressions @cindex Non-bugs, regex syntax clashes @command{sed} uses the @sc{posix} basic regular expression syntax. According to the standard, the meaning of some escape sequences is undefined in this syntax; notable in the case of @command{sed} are @code{\|}, @code{\+}, @code{\?}, @code{\`}, @code{\'}, @code{\<}, @code{\>}, @code{\b}, @code{\B}, @code{\w}, and @code{\W}. As in all @acronym{GNU} programs that use @sc{posix} basic regular expressions, @command{sed} interprets these escape sequences as special characters. So, @code{x\+} matches one or more occurrences of @samp{x}. @code{abc\|def} matches either @samp{abc} or @samp{def}. This syntax may cause problems when running scripts written for other @command{sed}s. Some @command{sed} programs have been written with the assumption that @code{\|} and @code{\+} match the literal characters @code{|} and @code{+}. Such scripts must be modified by removing the spurious backslashes if they are to be used with modern implementations of @command{sed}, like @ifset PERL @value{SSED} or @end ifset @acronym{GNU} @command{sed}. On the other hand, some scripts use s|abc\|def||g to remove occurrences of @emph{either} @code{abc} or @code{def}. While this worked until @command{sed} 4.0.x, newer versions interpret this as removing the string @code{abc|def}. This is again undefined behavior according to @acronym{POSIX}, and this interpretation is arguably more robust: older @command{sed}s, for example, required that the regex matcher parsed @code{\/} as @code{/} in the common case of escaping a slash, which is again undefined behavior; the new behavior avoids this, and this is good because the regex matcher is only partially under our control. @cindex @acronym{GNU} extensions, special escapes In addition, this version of @command{sed} supports several escape characters (some of which are multi-character) to insert non-printable characters in scripts (@code{\a}, @code{\c}, @code{\d}, @code{\o}, @code{\r}, @code{\t}, @code{\v}, @code{\x}). These can cause similar problems with scripts written for other @command{sed}s. @item @option{-i} clobbers read-only files @cindex In-place editing @cindex @value{SSEDEXT}, in-place editing @cindex Non-bugs, in-place editing In short, @samp{sed -i} will let you delete the contents of a read-only file, and in general the @option{-i} option (@pxref{Invoking sed, , Invocation}) lets you clobber protected files. This is not a bug, but rather a consequence of how the Unix filesystem works. The permissions on a file say what can happen to the data in that file, while the permissions on a directory say what can happen to the list of files in that directory. @samp{sed -i} will not ever open for writing a file that is already on disk. Rather, it will work on a temporary file that is finally renamed to the original name: if you rename or delete files, you're actually modifying the contents of the directory, so the operation depends on the permissions of the directory, not of the file. For this same reason, @command{sed} does not let you use @option{-i} on a writeable file in a read-only directory (but unbelievably nobody reports that as a bug@dots{}). @item @code{0a} does not work (gives an error) There is no line 0. 0 is a special address that is only used to treat addresses like @code{0,/@var{RE}/} as active when the script starts: if you write @code{1,/abc/d} and the first line includes the word @samp{abc}, then that match would be ignored because address ranges must span at least two lines (barring the end of the file); but what you probably wanted is to delete every line up to the first one including @samp{abc}, and this is obtained with @code{0,/abc/d}. @ifclear PERL @item @code{[a-z]} is case insensitive You are encountering problems with locales. POSIX mandates that @code{[a-z]} uses the current locale's collation order -- in C parlance, that means using @code{strcoll(3)} instead of @code{strcmp(3)}. Some locales have a case-insensitive collation order, others don't: one of those that have problems is Estonian. Another problem is that @code{[a-z]} tries to use collation symbols. This only happens if you are on the @acronym{GNU} system, using @acronym{GNU} libc's regular expression matcher instead of compiling the one supplied with @acronym{GNU} sed. In a Danish locale, for example, the regular expression @code{^[a-z]$} matches the string @samp{aa}, because this is a single collating symbol that comes after @samp{a} and before @samp{b}; @samp{ll} behaves similarly in Spanish locales, or @samp{ij} in Dutch locales. To work around these problems, which may cause bugs in shell scripts, set the @env{LC_COLLATE} and @env{LC_CTYPE} environment variables to @samp{C}. @end ifclear @end table @node Extended regexps @appendix Extended regular expressions @cindex Extended regular expressions, syntax The only difference between basic and extended regular expressions is in the behavior of a few characters: @samp{?}, @samp{+}, parentheses, and braces (@samp{@{@}}). While basic regular expressions require these to be escaped if you want them to behave as special characters, when using extended regular expressions you must escape them if you want them @emph{to match a literal character}. @noindent Examples: @table @code @item abc? becomes @samp{abc\?} when using extended regular expressions. It matches the literal string @samp{abc?}. @item c\+ becomes @samp{c+} when using extended regular expressions. It matches one or more @samp{c}s. @item a\@{3,\@} becomes @samp{a@{3,@}} when using extended regular expressions. It matches three or more @samp{a}s. @item \(abc\)\@{2,3\@} becomes @samp{(abc)@{2,3@}} when using extended regular expressions. It matches either @samp{abcabc} or @samp{abcabcabc}. @item \(abc*\)\1 becomes @samp{(abc*)\1} when using extended regular expressions. Backreferences must still be escaped when using extended regular expressions. @end table @ifset PERL @node Perl regexps @appendix Perl-style regular expressions @cindex Perl-style regular expressions, syntax @emph{This part is taken from the @file{pcre.txt} file distributed together with the free @sc{pcre} regular expression matcher; it was written by Philip Hazel.} Perl introduced several extensions to regular expressions, some of them incompatible with the syntax of regular expressions accepted by Emacs and other @acronym{GNU} tools (whose matcher was based on the Emacs matcher). @value{SSED} implements both kinds of extensions. @iftex Summarizing, we have: @itemize @bullet @item A backslash can introduce several special sequences @item The circumflex, dollar sign, and period characters behave specially with regard to new lines @item Strange uses of square brackets are parsed differently @item You can toggle modifiers in the middle of a regular expression @item You can specify that a subpattern does not count when numbering backreferences @item @cindex Greedy regular expression matching You can specify greedy or non-greedy matching @item You can have more than ten back references @item You can do complex look aheads and look behinds (in the spirit of @code{\b}, but with subpatterns). @item You can often improve performance by avoiding that @command{sed} wastes time with backtracking @item You can have if/then/else branches @item You can do recursive matches, for example to look for unbalanced parentheses @item You can have comments and non-significant whitespace, because things can get complex... @end itemize Most of these extensions are introduced by the special @code{(?} sequence, which gives special meanings to parenthesized groups. @end iftex @menu Other extensions can be roughly subdivided in two categories On one hand Perl introduces several more escaped sequences (that is, sequences introduced by a backslash). On the other hand, it specifies that if a question mark follows an open parentheses it should give a special meaning to the parenthesized group. * Backslash:: Introduces special sequences * Circumflex/dollar sign/period:: Behave specially with regard to new lines * Square brackets:: Are a bit different in strange cases * Options setting:: Toggle modifiers in the middle of a regexp * Non-capturing subpatterns:: Are not counted when backreferencing * Repetition:: Allows for non-greedy matching * Backreferences:: Allows for more than 10 back references * Assertions:: Allows for complex look ahead matches * Non-backtracking subpatterns:: Often gives more performance * Conditional subpatterns:: Allows if/then/else branches * Recursive patterns:: For example to match parentheses * Comments:: Because things can get complex... @end menu @node Backslash @appendixsec Backslash @cindex Perl-style regular expressions, escaped sequences There are a few difference in the handling of backslashed sequences in Perl mode. First of all, there are no @code{\o} and @code{\d} sequences. @sc{ascii} values for characters can be specified in octal with a @code{\@var{xxx}} sequence, where @var{xxx} is a sequence of up to three octal digits. If the first digit is a zero, the treatment of the sequence is straightforward; just note that if the character that follows the escaped digit is itself an octal digit, you have to supply three octal digits for @var{xxx}. For example @code{\07} is a @sc{bel} character rather than a @sc{nul} and a literal @code{7} (this sequence is instead represented by @code{\0007}). @cindex Perl-style regular expressions, backreferences The handling of a backslash followed by a digit other than 0 is complicated. Outside a character class, @command{sed} reads it and any following digits as a decimal number. If the number is less than 10, or if there have been at least that many previous capturing left parentheses in the expression, the entire sequence is taken as a back reference. A description of how this works is given later, following the discussion of parenthesized subpatterns. Inside a character class, or if the decimal number is greater than 9 and there have not been that many capturing subpatterns, @command{sed} re-reads up to three octal digits following the backslash, and generates a single byte from the least significant 8 bits of the value. Any subsequent digits stand for themselves. For example: @example \040 @i{is another way of writing a space} \40 @i{is the same, provided there are fewer than 40} @i{previous capturing subpatterns} \7 @i{is always a back reference} \011 @i{is always a tab} \11 @i{might be a back reference, or another way of} @i{writing a tab} \0113 @i{is a tab followed by the character @samp{3}} \113 @i{is the character with octal code 113 (since there} @i{can be no more than 99 back references)} \377 @i{is a byte consisting entirely of 1 bits (@sc{ascii} 255)} \81 @i{is either a back reference, or a binary zero} @i{followed by the two characters @samp{81}} @end example Note that octal values of 100 or greater must not be introduced duced by a leading zero, because no more than three octal digits are ever read. All the sequences that define a single byte value can be used both inside and outside character classes. In addition, inside a character class, the sequence @code{\b} is interpreted as the backspace character (hex 08). Outside a character class it has a different meaning (see below). In addition, there are four additional escapes specifying generic character classes (like @code{\w} and @code{\W} do): @cindex Perl-style regular expressions, character classes @table @samp @item \d Matches any decimal digit @item \D Matches any character that is not a decimal digit @end table In Perl mode, these character type sequences can appear both inside and outside character classes. Instead, in @sc{posix} mode these sequences (as well as @code{\w} and @code{\W}) are treated as two literal characters (a backslash and a letter) inside square brackets. Escaped sequences specifying assertions are also different in Perl mode. An assertion specifies a condition that has to be met at a particular point in a match, without consuming any characters from the subject string. The use of subpatterns for more complicated assertions is described below. The backslashed assertions are @cindex Perl-style regular expressions, assertions @table @samp @item \b Asserts that the point is at a word boundary. A word boundary is a position in the subject string where the current character and the previous character do not both match @code{\w} or @code{\W} (i.e. one matches @code{\w} and the other matches @code{\W}), or the start or end of the string if the first or last character matches @code{\w}, respectively. @item \B Asserts that the point is not at a word boundary. @item \A Asserts the matcher is at the start of pattern space (independent of multiline mode). @item \Z Asserts the matcher is at the end of pattern space, or at a newline before the end of pattern space (independent of multiline mode) @item \z Asserts the matcher is at the end of pattern space (independent of multiline mode) @end table These assertions may not appear in character classes (but note that @code{\b} has a different meaning, namely the backspace character, inside a character class). Note that Perl mode does not support directly assertions for the beginning and the end of word; the @acronym{GNU} extensions @code{\<} and @code{\>} achieve this purpose in @sc{posix} mode instead. The @code{\A}, @code{\Z}, and @code{\z} assertions differ from the traditional circumflex and dollar sign (described below) in that they only ever match at the very start and end of the subject string, whatever options are set; in particular @code{\A} and @code{\z} are the same as the @acronym{GNU} extensions @code{\`} and @code{\'} that are active in @sc{posix} mode. @node Circumflex/dollar sign/period @appendixsec Circumflex, dollar sign, period @cindex Perl-style regular expressions, newlines Outside a character class, in the default matching mode, the circumflex character is an assertion which is true only if the current matching point is at the start of the subject string. Inside a character class, the circumflex has an entirely different meaning (see below). The circumflex need not be the first character of the pattern if a number of alternatives are involved, but it should be the first thing in each alternative in which it appears if the pattern is ever to match that branch. If all possible alternatives, start with a circumflex, that is, if the pattern is constrained to match only at the start of the subject, it is said to be an @dfn{anchored} pattern. (There are also other constructs structs that can cause a pattern to be anchored.) A dollar sign is an assertion which is true only if the current matching point is at the end of the subject string, or immediately before a newline character that is the last character in the string (by default). A dollar sign need not be the last character of the pattern if a number of alternatives are involved, but it should be the last item in any branch in which it appears. A dollar sign has no special meaning in a character class. @cindex Perl-style regular expressions, multiline The meanings of the circumflex and dollar sign characters are changed if the @code{M} modifier option is used. When this is the case, they match immediately after and immediately before an internal @code{\n} character, respectively, in addition to matching at the start and end of the subject string. For example, the pattern @code{/^abc$/} matches the subject string @samp{def\nabc} in multiline mode, but not otherwise. Consequently, patterns that are anchored in single line mode because all branches start with @code{^} are not anchored in multiline mode. @cindex Perl-style regular expressions, multiline Note that the sequences @code{\A}, @code{\Z}, and @code{\z} can be used to match the start and end of the subject in both modes, and if all branches of a pattern start with @code{\A} is it always anchored, whether the @code{M} modifier is set or not. @cindex Perl-style regular expressions, single line Outside a character class, a dot in the pattern matches any one character in the subject, including a non-printing character, but not (by default) newline. If the @code{S} modifier is used, dots match newlines as well. Actually, the handling of dot is entirely independent of the handling of circumflex and dollar sign, the only relationship being that they both involve newline characters. Dot has no special meaning in a character class. @node Square brackets @appendixsec Square brackets @cindex Perl-style regular expressions, character classes An opening square bracket introduces a character class, terminated by a closing square bracket. A closing square bracket on its own is not special. If a closing square bracket is required as a member of the class, it should be the first data character in the class (after an initial circumflex, if present) or escaped with a backslash. A character class matches a single character in the subject; the character must be in the set of characters defined by the class, unless the first character in the class is a circumflex, in which case the subject character must not be in the set defined by the class. If a circumflex is actually required as a member of the class, ensure it is not the first character, or escape it with a backslash. For example, the character class [aeiou] matches any lower case vowel, while [^aeiou] matches any character that is not a lower case vowel. Note that a circumflex is just a convenient venient notation for specifying the characters which are in the class by enumerating those that are not. It is not an assertion: it still consumes a character from the subject string, and fails if the current pointer is at the end of the string. @cindex Perl-style regular expressions, case-insensitive When caseless matching is set, any letters in a class represent both their upper case and lower case versions, so for example, a caseless @code{[aeiou]} matches uppercase and lowercase @samp{A}s, and a caseless @code{[^aeiou]} does not match @samp{A}, whereas a case-sensitive version would. @cindex Perl-style regular expressions, single line @cindex Perl-style regular expressions, multiline The newline character is never treated in any special way in character classes, whatever the setting of the @code{S} and @code{M} options (modifiers) is. A class such as @code{[^a]} will always match a newline. The minus (hyphen) character can be used to specify a range of characters in a character class. For example, @code{[d-m]} matches any letter between d and m, inclusive. If a minus character is required in a class, it must be escaped with a backslash or appear in a position where it cannot be interpreted as indicating a range, typically as the first or last character in the class. It is not possible to have the literal character @code{]} as the end character of a range. A pattern such as @code{[W-]46]} is interpreted as a class of two characters (@code{W} and @code{-}) followed by a literal string @code{46]}, so it would match @samp{W46]} or @samp{-46]}. However, if the @code{]} is escaped with a backslash it is interpreted as the end of range, so @code{[W-\]46]} is interpreted as a single class containing a range followed by two separate characters. The octal or hexadecimal representation of @code{]} can also be used to end a range. Ranges operate in @sc{ascii} collating sequence. They can also be used for characters specified numerically, for example @code{[\000-\037]}. If a range that includes letters is used when caseless matching is set, it matches the letters in either case. For example, a caseless @code{[W-c]} is equivalent to @code{[][\^_`wxyzabc]}, matched caselessly, and if character tables for the French locale are in use, @code{[\xc8-\xcb]} matches accented E characters in both cases. Unlike in @sc{posix} mode, the character types @code{\d}, @code{\D}, @code{\s}, @code{\S}, @code{\w}, and @code{\W} may also appear in a character class, and add the characters that they match to the class. For example, @code{[\dABCDEF]} matches any hexadecimal digit. A circumflex can conveniently be used with the upper case character types to specify a more restricted set of characters than the matching lower case type. For example, the class @code{[^\W_]} matches any letter or digit, but not underscore. All non-alphameric characters other than @code{\}, @code{-}, @code{^} (at the start) and the terminating @code{]} are non-special in character classes, but it does no harm if they are escaped. Perl 5.6 supports the @sc{posix} notation for character classes, which uses names enclosed by @code{[:} and @code{:]} within the enclosing square brackets, and @value{SSED} supports this notation as well. For example, @example [01[:alpha:]%] @end example @noindent matches @samp{0}, @samp{1}, any alphabetic character, or @samp{%}. The supported class names are @table @code @item alnum Matches letters and digits @item alpha Matches letters @item ascii Matches character codes 0 - 127 @item cntrl Matches control characters @item digit Matches decimal digits (same as \d) @item graph Matches printing characters, excluding space @item lower Matches lower case letters @item print Matches printing characters, including space @item punct Matches printing characters, excluding letters and digits @item space Matches white space (same as \s) @item upper Matches upper case letters @item word Matches ``word'' characters (same as \w) @item xdigit Matches hexadecimal digits @end table The names @code{ascii} and @code{word} are extensions valid only in Perl mode. Another Perl extension is negation, which is indicated by a circumflex character after the colon. For example, @example [12[:^digit:]] @end example @noindent matches @samp{1}, @samp{2}, or any non-digit. @node Options setting @appendixsec Options setting @cindex Perl-style regular expressions, toggling options @cindex Perl-style regular expressions, case-insensitive @cindex Perl-style regular expressions, multiline @cindex Perl-style regular expressions, single line @cindex Perl-style regular expressions, extended The settings of the @code{I}, @code{M}, @code{S}, @code{X} modifiers can be changed from within the pattern by a sequence of Perl option letters enclosed between @code{(?} and @code{)}. The option letters must be lowercase. For example, @code{(?im)} sets caseless, multiline matching. It is also possible to unset these options by preceding the letter with a hyphen; you can also have combined settings and unsettings: @code{(?im-sx)} sets caseless and multiline matching, while unsets single line matching (for dots) and extended whitespace interpretation. If a letter appears both before and after the hyphen, the option is unset. The scope of these option changes depends on where in the pattern the setting occurs. For settings that are outside any subpattern (defined below), the effect is the same as if the options were set or unset at the start of matching. The following patterns all behave in exactly the same way: @example (?i)abc a(?i)bc ab(?i)c abc(?i) @end example which in turn is the same as specifying the pattern abc with the @code{I} modifier. In other words, ``top level'' settings apply to the whole pattern (unless there are other changes inside subpatterns). If there is more than one setting of the same option at top level, the rightmost setting is used. If an option change occurs inside a subpattern, the effect is different. This is a change of behaviour in Perl 5.005. An option change inside a subpattern affects only that part of the subpattern @emph{that follows} it, so @example (a(?i)b)c @end example @noindent matches abc and aBc and no other strings (assuming case-sensitive matching is used). By this means, options can be made to have different settings in different parts of the pattern. Any changes made in one alternative do carry on into subsequent branches within the same subpattern. For example, @example (a(?i)b|c) @end example @noindent matches @samp{ab}, @samp{aB}, @samp{c}, and @samp{C}, even though when matching @samp{C} the first branch is abandoned before the option setting. This is because the effects of option settings happen at compile time. There would be some very weird behaviour otherwise. @ignore There are two PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA that can be changed in the same way as the Perl-compatible options by using the characters U and X respectively. The (?X) flag setting is special in that it must always occur earlier in the pattern than any of the additional features it turns on, even when it is at top level. It is best put at the start. @end ignore @node Non-capturing subpatterns @appendixsec Non-capturing subpatterns @cindex Perl-style regular expressions, non-capturing subpatterns Marking part of a pattern as a subpattern does two things. On one hand, it localizes a set of alternatives; on the other hand, it sets up the subpattern as a capturing subpattern (as defined above). The subpattern can be backreferenced and referenced in the right side of @code{s} commands. For example, if the string @samp{the red king} is matched against the pattern @example the ((red|white) (king|queen)) @end example @noindent the captured substrings are @samp{red king}, @samp{red}, and @samp{king}, and are numbered 1, 2, and 3. The fact that plain parentheses fulfil two functions is not always helpful. There are often times when a grouping subpattern is required without a capturing requirement. If an opening parenthesis is followed by @code{?:}, the subpattern does not do any capturing, and is not counted when computing the number of any subsequent capturing subpatterns. For example, if the string @samp{the white queen} is matched against the pattern @example the ((?:red|white) (king|queen)) @end example @noindent the captured substrings are @samp{white queen} and @samp{queen}, and are numbered 1 and 2. The maximum number of captured substrings is 99, while the maximum number of all subpatterns, both capturing and non-capturing, is 200. As a convenient shorthand, if any option settings are equired at the start of a non-capturing subpattern, the option letters may appear between the @code{?} and the @code{:}. Thus the two patterns @example (?i:saturday|sunday) (?:(?i)saturday|sunday) @end example @noindent match exactly the same set of strings. Because alternative branches are tried from left to right, and options are not reset until the end of the subpattern is reached, an option setting in one branch does affect subsequent branches, so the above patterns match @samp{SUNDAY} as well as @samp{Saturday}. @node Repetition @appendixsec Repetition @cindex Perl-style regular expressions, repetitions Repetition is specified by quantifiers, which can follow any of the following items: @itemize @bullet @item a single character, possibly escaped @item the @code{.} special character @item a character class @item a back reference (see next section) @item a parenthesized subpattern (unless it is an assertion; @pxref{Assertions}) @end itemize The general repetition quantifier specifies a minimum and maximum number of permitted matches, by giving the two numbers in curly brackets (braces), separated by a comma. The numbers must be less than 65536, and the first must be less than or equal to the second. For example: @example z@{2,4@} @end example @noindent matches @samp{zz}, @samp{zzz}, or @samp{zzzz}. A closing brace on its own is not a special character. If the second number is omitted, but the comma is present, there is no upper limit; if the second number and the comma are both omitted, the quantifier specifies an exact number of required matches. Thus @example [aeiou]@{3,@} @end example @noindent matches at least 3 successive vowels, but may match many more, while @example \d@{8@} @end example @noindent matches exactly 8 digits. An opening curly bracket that appears in a position where a quantifier is not allowed, or one that does not match the syntax of a quantifier, is taken as a literal character. For example, @{,6@} is not a quantifier, but a literal string of four characters.@footnote{It raises an error if @option{-R} is not used.} The quantifier @samp{@{0@}} is permitted, causing the expression to behave as if the previous item and the quantifier were not present. For convenience (and historical compatibility) the three most common quantifiers have single-character abbreviations: @table @code @item * is equivalent to @{0,@} @item + is equivalent to @{1,@} @item ? is equivalent to @{0,1@} @end table It is possible to construct infinite loops by following a subpattern that can match no characters with a quantifier that has no upper limit, for example: @example (a?)* @end example Earlier versions of Perl used to give an error at compile time for such patterns. However, because there are cases where this can be useful, such patterns are now accepted, but if any repetition of the subpattern does in fact match no characters, the loop is forcibly broken. @cindex Greedy regular expression matching @cindex Perl-style regular expressions, stingy repetitions By default, the quantifiers are @dfn{greedy} like in @sc{posix} mode, that is, they match as much as possible (up to the maximum number of permitted times), without causing the rest of the pattern to fail. The classic example of where this gives problems is in trying to match comments in C programs. These appear between the sequences @code{/*} and @code{*/} and within the sequence, individual @code{*} and @code{/} characters may appear. An attempt to match C comments by applying the pattern @example /\*.*\*/ @end example @noindent to the string @example /* first command */ not comment /* second comment */ @end example @noindent fails, because it matches the entire string owing to the greediness of the @code{.*} item. However, if a quantifier is followed by a question mark, it ceases to be greedy, and instead matches the minimum number of times possible, so the pattern @code{/\*.*?\*/} does the right thing with the C comments. The meaning of the various quantifiers is not otherwise changed, just the preferred number of matches. Do not confuse this use of question mark with its use as a quantifier in its own right. Because it has two uses, it can sometimes appear doubled, as in @example \d??\d @end example which matches one digit by preference, but can match two if that is the only way the rest of the pattern matches. Note that greediness does not matter when specifying addresses, but can be nevertheless used to improve performance. @ignore If the PCRE_UNGREEDY option is set (an option which is not available in Perl), the quantifiers are not greedy by default, but individual ones can be made greedy by following them with a question mark. In other words, it inverts the default behaviour. @end ignore When a parenthesized subpattern is quantified with a minimum repeat count that is greater than 1 or with a limited maximum, more store is required for the compiled pattern, in proportion to the size of the minimum or maximum. @cindex Perl-style regular expressions, single line If a pattern starts with @code{.*} or @code{.@{0,@}} and the @code{S} modifier is used, the pattern is implicitly anchored, because whatever follows will be tried against every character position in the subject string, so there is no point in retrying the overall match at any position after the first. PCRE treats such a pattern as though it were preceded by \A. When a capturing subpattern is repeated, the value captured is the substring that matched the final iteration. For example, after @example (tweedle[dume]@{3@}\s*)+ @end example @noindent has matched @samp{tweedledum tweedledee} the value of the captured substring is @samp{tweedledee}. However, if there are nested capturing subpatterns, the corresponding captured values may have been set in previous iterations. For example, after @example /(a|(b))+/ @end example matches @samp{aba}, the value of the second captured substring is @samp{b}. @node Backreferences @appendixsec Backreferences @cindex Perl-style regular expressions, backreferences Outside a character class, a backslash followed by a digit greater than 0 (and possibly further digits) is a back reference to a capturing subpattern earlier (i.e. to its left) in the pattern, provided there have been that many previous capturing left parentheses. However, if the decimal number following the backslash is less than 10, it is always taken as a back reference, and causes an error only if there are not that many capturing left parentheses in the entire pattern. In other words, the parentheses that are referenced need not be to the left of the reference for numbers less than 10. @ref{Backslash} for further details of the handling of digits following a backslash. A back reference matches whatever actually matched the capturing subpattern in the current subject string, rather than anything matching the subpattern itself. So the pattern @example (sens|respons)e and \1ibility @end example @noindent matches @samp{sense and sensibility} and @samp{response and responsibility}, but not @samp{sense and responsibility}. If caseful matching is in force at the time of the back reference, the case of letters is relevant. For example, @example ((?i)blah)\s+\1 @end example @noindent matches @samp{blah blah} and @samp{Blah Blah}, but not @samp{BLAH blah}, even though the original capturing subpattern is matched caselessly. There may be more than one back reference to the same subpattern. Also, if a subpattern has not actually been used in a particular match, any back references to it always fail. For example, the pattern @example (a|(bc))\2 @end example @noindent always fails if it starts to match @samp{a} rather than @samp{bc}. Because there may be up to 99 back references, all digits following the backslash are taken as part of a potential back reference number; this is different from what happens in @sc{posix} mode. If the pattern continues with a digit character, some delimiter must be used to terminate the back reference. If the @code{X} modifier option is set, this can be whitespace. Otherwise an empty comment can be used, or the following character can be expressed in hexadecimal or octal. A back reference that occurs inside the parentheses to which it refers fails when the subpattern is first used, so, for example, @code{(a\1)} never matches. However, such references can be useful inside repeated subpatterns. For example, the pattern @example (a|b\1)+ @end example @noindent matches any number of @samp{a}s and also @samp{aba}, @samp{ababbaa}, etc. At each iteration of the subpattern, the back reference matches the character string corresponding to the previous iteration. In order for this to work, the pattern must be such that the first iteration does not need to match the back reference. This can be done using alternation, as in the example above, or by a quantifier with a minimum of zero. @node Assertions @appendixsec Assertions @cindex Perl-style regular expressions, assertions @cindex Perl-style regular expressions, asserting subpatterns An assertion is a test on the characters following or preceding the current matching point that does not actually consume any characters. The simple assertions coded as @code{\b}, @code{\B}, @code{\A}, @code{\Z}, @code{\z}, @code{^} and @code{$} are described above. More complicated assertions are coded as subpatterns. There are two kinds: those that look ahead of the current position in the subject string, and those that look behind it. @cindex Perl-style regular expressions, lookahead subpatterns An assertion subpattern is matched in the normal way, except that it does not cause the current matching position to be changed. Lookahead assertions start with @code{(?=} for positive assertions and @code{(?!} for negative assertions. For example, @example \w+(?=;) @end example @noindent matches a word followed by a semicolon, but does not include the semicolon in the match, and @example foo(?!bar) @end example @noindent matches any occurrence of @samp{foo} that is not followed by @samp{bar}. Note that the apparently similar pattern @example (?!foo)bar @end example @noindent @cindex Perl-style regular expressions, lookbehind subpatterns finds any occurrence of @samp{bar} even if it is preceded by @samp{foo}, because the assertion @code{(?!foo)} is always true when the next three characters are @samp{bar}. A lookbehind assertion is needed to achieve this effect. Lookbehind assertions start with @code{(?<=} for positive assertions and @code{(?} as in this example: @example (?>\d+)bar @end example This kind of parenthesis ``locks up'' the part of the pattern it contains once it has matched, and a failure further into the pattern is prevented from backtracking into it. Backtracking past it to previous items, however, works as normal. Non-backtracking subpatterns are not capturing subpatterns. Simple cases such as the above example can be thought of as a maximizing repeat that must swallow everything it can. So, while both @code{\d+} and @code{\d+?} are prepared to adjust the number of digits they match in order to make the rest of the pattern match, @code{(?>\d+)} can only match an entire sequence of digits. This construction can of course contain arbitrarily complicated subpatterns, and it can be nested. @cindex Perl-style regular expressions, lookbehind subpatterns Non-backtracking subpatterns can be used in conjunction with look-behind assertions to specify efficient matching at the end of the subject string. Consider a simple pattern such as @example abcd$ @end example @noindent when applied to a long string which does not match. Because matching proceeds from left to right, @command{sed} will look for each @samp{a} in the subject and then see if what follows matches the rest of the pattern. If the pattern is specified as @example ^.*abcd$ @end example @noindent the initial @code{.*} matches the entire string at first, but when this fails (because there is no following @samp{a}), it backtracks to match all but the last character, then all but the last two characters, and so on. Once again the search for @samp{a} covers the entire string, from right to left, so we are no better off. However, if the pattern is written as @example ^(?>.*)(?<=abcd) @end example there can be no backtracking for the .* item; it can match only the entire string. The subsequent lookbehind assertion does a single test on the last four characters. If it fails, the match fails immediately. For long strings, this approach makes a significant difference to the processing time. When a pattern contains an unlimited repeat inside a subpattern that can itself be repeated an unlimited number of times, the use of a once-only subpattern is the only way to avoid some failing matches taking a very long time indeed.@footnote{Actually, the matcher embedded in @value{SSED} tries to do something for this in the simplest cases, like @code{([^b]*b)*}. These cases are actually quite common: they happen for example in a regular expression like @code{\/\*([^*]*\*)*\/} which matches C comments.} The pattern @example (\D+|<\d+>)*[!?] @end example ([^0-9<]+<(\d+>)?)*[!?] @noindent matches an unlimited number of substrings that either consist of non-digits, or digits enclosed in angular brackets, followed by an exclamation or question mark. When it matches, it runs quickly. However, if it is applied to @example aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @end example @noindent it takes a long time before reporting failure. This is because the string can be divided between the two repeats in a large number of ways, and all have to be tried.@footnote{The example used @code{[!?]} rather than a single character at the end, because both @value{SSED} and Perl have an optimization that allows for fast failure when a single character is used. They remember the last single character that is required for a match, and fail early if it is not present in the string.} If the pattern is changed to @example ((?>\D+)|<\d+>)*[!?] @end example sequences of non-digits cannot be broken, and failure happens quickly. @node Conditional subpatterns @appendixsec Conditional subpatterns @cindex Perl-style regular expressions, conditional subpatterns It is possible to cause the matching process to obey a subpattern conditionally or to choose between two alternative subpatterns, depending on the result of an assertion, or whether a previous capturing subpattern matched or not. The two possible forms of conditional subpattern are @example (?(@var{condition})@var{yes-pattern}) (?(@var{condition})@var{yes-pattern}|@var{no-pattern}) @end example If the condition is satisfied, the yes-pattern is used; otherwise the no-pattern (if present) is used. If there are more than two alternatives in the subpattern, a compile-time error occurs. There are two kinds of condition. If the text between the parentheses consists of a sequence of digits, the condition is satisfied if the capturing subpattern of that number has previously matched. The number must be greater than zero. Consider the following pattern, which contains non-significant white space to make it more readable (assume the @code{X} modifier) and to divide it into three parts for ease of discussion: @example ( \( )? [^()]+ (?(1) \) ) @end example The first part matches an optional opening parenthesis, and if that character is present, sets it as the first captured substring. The second part matches one or more characters that are not parentheses. The third part is a conditional subpattern that tests whether the first set of parentheses matched or not. If they did, that is, if subject started with an opening parenthesis, the condition is true, and so the yes-pattern is executed and a closing parenthesis is required. Otherwise, since no-pattern is not present, the subpattern matches nothing. In other words, this pattern matches a sequence of non-parentheses, optionally enclosed in parentheses. @cindex Perl-style regular expressions, lookahead subpatterns If the condition is not a sequence of digits, it must be an assertion. This may be a positive or negative lookahead or lookbehind assertion. Consider this pattern, again containing non-significant white space, and with the two alternatives on the second line: @example (?(?=...[a-z]) \d\d-[a-z]@{3@}-\d\d | \d\d-\d\d-\d\d ) @end example The condition is a positive lookahead assertion that matches a letter that is three characters away from the current point. If a letter is found, the subject is matched against the first alternative @samp{@var{dd}-@var{aaa}-@var{dd}} (where @var{aaa} are letters and @var{dd} are digits); otherwise it is matched against the second alternative, @samp{@var{dd}-@var{dd}-@var{dd}}. @node Recursive patterns @appendixsec Recursive patterns @cindex Perl-style regular expressions, recursive patterns @cindex Perl-style regular expressions, recursion Consider the problem of matching a string in parentheses, allowing for unlimited nested parentheses. Without the use of recursion, the best that can be done is to use a pattern that matches up to some fixed depth of nesting. It is not possible to handle an arbitrary nesting depth. Perl 5.6 has provided an experimental facility that allows regular expressions to recurse (amongst other things). It does this by interpolating Perl code in the expression at run time, and the code can refer to the expression itself. A Perl pattern tern to solve the parentheses problem can be created like this: @example $re = qr@{\( (?: (?>[^()]+) | (?p@{$re@}) )* \)@}x; @end example The @code{(?p@{...@})} item interpolates Perl code at run time, and in this case refers recursively to the pattern in which it appears. Obviously, @command{sed} cannot support the interpolation of Perl code. Instead, the special item @code{(?R)} is provided for the specific case of recursion. This pattern solves the parentheses problem (assume the @code{X} modifier option is used so that white space is ignored): @example \( ( (?>[^()]+) | (?R) )* \) @end example First it matches an opening parenthesis. Then it matches any number of substrings which can either be a sequence of non-parentheses, or a recursive match of the pattern itself (i.e. a correctly parenthesized substring). Finally there is a closing parenthesis. This particular example pattern contains nested unlimited repeats, and so the use of a non-backtracking subpattern for matching strings of non-parentheses is important when applying the pattern to strings that do not match. For example, when it is applied to @example (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() @end example it yields a ``no match'' response quickly. However, if a standard backtracking subpattern is not used, the match runs for a very long time indeed because there are so many different ways the @code{+} and @code{*} repeats can carve up the subject, and all have to be tested before failure can be reported. The values set for any capturing subpatterns are those from the outermost level of the recursion at which the subpattern value is set. If the pattern above is matched against @example (ab(cd)ef) @end example @noindent the value for the capturing parentheses is @samp{ef}, which is the last value taken on at the top level. @node Comments @appendixsec Comments @cindex Perl-style regular expressions, comments The sequence (?# marks the start of a comment which continues ues up to the next closing parenthesis. Nested parentheses are not permitted. The characters that make up a comment play no part in the pattern matching at all. @cindex Perl-style regular expressions, extended If the @code{X} modifier option is used, an unescaped @code{#} character outside a character class introduces a comment that continues up to the next newline character in the pattern. @end ifset @page @node Concept Index @unnumbered Concept Index This is a general index of all issues discussed in this manual, with the exception of the @command{sed} commands and command-line options. @printindex cp @page @node Command and Option Index @unnumbered Command and Option Index This is an alphabetical list of all @command{sed} commands and command-line options. @printindex fn @contents @bye @c XXX FIXME: the term "cycle" is never defined... sed-3.62/doc/sed.10000644000076600007660000002113310202633245010553 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.28. .TH SUPER-SED "1" "February 2005" "super-sed version 3.61" "User Commands" .SH NAME super-sed \- manual page for super-sed version 3.61 .SH SYNOPSIS .B sed [\fIOPTION\fR]... \fI{script-only-if-no-other-script} \fR[\fIinput-file\fR]... .SH DESCRIPTION .ds sd \fIsed\fP .ds Sd \fISed\fP \*(Sd is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as \fIed\fP), \*(sd works by making only one pass over the input(s), and is consequently more efficient. But it is \*(sd's ability to filter text in a pipeline which particularly distinguishes it from other types of editors. .HP \fB\-n\fR, \fB\-\-quiet\fR, \fB\-\-silent\fR .IP suppress automatic printing of pattern space .HP \fB\-e\fR script, \fB\-\-expression\fR=\fIscript\fR .IP add the script to the commands to be executed .HP \fB\-f\fR script-file, \fB\-\-file\fR=\fIscript\-file\fR .IP add the contents of script-file to the commands to be executed .HP \fB\-i[SUFFIX]\fR, \fB\-\-in\-place\fR[=\fISUFFIX\fR] .IP edit files in place (makes backup if extension supplied) .HP \fB\-l\fR N, \fB\-\-line\-length\fR=\fIN\fR .IP specify the desired line-wrap length for the `l' command .HP \fB\-\-posix\fR .IP disable all GNU extensions. .HP \fB\-r\fR, \fB\-\-regexp\-extended\fR .IP use extended regular expressions in the script. .HP \fB\-R\fR, \fB\-\-regexp\-perl\fR .IP use Perl 5's regular expressions syntax in the script. .HP \fB\-s\fR, \fB\-\-separate\fR .IP consider files as separate rather than as a single continuous long stream. .HP \fB\-u\fR, \fB\-\-unbuffered\fR .IP load minimal amounts of data from the input files and flush the output buffers more often .TP \fB\-\-help\fR display this help and exit .TP \fB\-\-version\fR output version information and exit .PP If no \fB\-e\fR, \fB\-\-expression\fR, \fB\-f\fR, or \fB\-\-file\fR option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. .PP E-mail bug reports to: bonzini@gnu.org . Be sure to include the word ``ssed'' somewhere in the ``Subject:'' field. .PP based on GNU sed version 4.1 .SH "COMMAND SYNOPSIS" This is just a brief synopsis of \*(sd commands to serve as a reminder to those who already know \*(sd; other documentation (such as the texinfo document) must be consulted for fuller descriptions. .SS Zero-address ``commands'' .TP .RI :\ label Label for .B b and .B t commands. .TP .RI # comment The comment extends until the next newline (or the end of a .B -e script fragment). .TP } The closing bracket of a { } block. .SS Zero- or One- address commands .TP = Print the current line number. .TP a \e .TP .I text Append .IR text , which has each embedded newline preceded by a backslash. .TP i \e .TP .I text Insert .IR text , which has each embedded newline preceded by a backslash. .TP q Immediately quit the \*(sd script without processing any more input, except that if auto-print is not disabled the current pattern space will be printed. .TP Q Immediately quit the \*(sd script without processing any more input. .TP .RI r\ filename Append text read from .IR filename . .TP .RI R\ filename Append a line read from .IR filename . .SS Commands which accept address ranges .TP { Begin a block of commands (end with a }). .TP .RI b\ label Branch to .IR label ; if .I label is omitted, branch to end of script. .TP .RI t\ label If a s/// has done a successful substitution since the last input line was read and since the last t or T command, then branch to .IR label ; if .I label is omitted, branch to end of script. .TP .RI T\ label If no s/// has done a successful substitution since the last input line was read and since the last t or T command, then branch to .IR label ; if .I label is omitted, branch to end of script. .TP c \e .TP .I text Replace the selected lines with .IR text , which has each embedded newline preceded by a backslash. .TP d Delete pattern space. Start next cycle. .TP D Delete up to the first embedded newline in the pattern space. Start next cycle, but skip reading from the input if there is still data in the pattern space. .TP h H Copy/append pattern space to hold space. .TP g G Copy/append hold space to pattern space. .TP x Exchange the contents of the hold and pattern spaces. .TP l List out the current line in a ``visually unambiguous'' form. .TP n N Read/append the next line of input into the pattern space. .TP p Print the current pattern space. .TP P Print up to the first embedded newline of the current pattern space. .TP .RI s/ regexp / replacement / Attempt to match .I regexp against the pattern space. If successful, replace that portion matched with .IR replacement . The .I replacement may contain the special character .B & to refer to that portion of the pattern space which matched, and the special escapes \e1 through \e9 to refer to the corresponding matching sub-expressions in the .IR regexp . .TP .RI w\ filename Write the current pattern space to .IR filename . .TP .RI W\ filename Write the first line of the current pattern space to .IR filename . .TP .RI y/ source / dest / Transliterate the characters in the pattern space which appear in .I source to the corresponding character in .IR dest . .SH Addresses \*(Sd commands can be given with no addresses, in which case the command will be executed for all input lines; with one address, in which case the command will only be executed for input lines which match that address; or with two addresses, in which case the command will be executed for all input lines which match the inclusive range of lines starting from the first address and continuing to the second address. Three things to note about address ranges: the syntax is .IR addr1 , addr2 (i.e., the addresses are separated by a comma); the line which .I addr1 matched will always be accepted, even if .I addr2 selects an earlier line; and if .I addr2 is a .IR regexp , it will not be tested against the line that .I addr1 matched. .PP After the address (or address-range), and before the command, a .B ! may be inserted, which specifies that the command shall only be executed if the address (or address-range) does .B not match. .PP The following address types are supported: .TP .I number Match only the specified line .IR number . .TP .IR first ~ step Match every .IR step 'th line starting with line .IR first . For example, ``sed -n 1~2p'' will print all the odd-numbered lines in the input stream, and the address 2~5 will match every fifth line, starting with the second. (This is an extension.) .TP $ Match the last line. .TP .RI / regexp / Match lines matching the regular expression .IR regexp . .TP .BI \fR\e\fPc regexp c Match lines matching the regular expression .IR regexp . The .B c may be any character. .PP GNU \*(sd also supports some special 2-address forms: .TP .RI 0, addr2 Start out in "matched first address" state, until .I addr2 is found. This is similar to .RI 1, addr2 , except that if .I addr2 matches the very first line of input the .RI 0, addr2 form will be at the end of its range, whereas the .RI 1, addr2 form will still be at the beginning of its range. .TP .IR addr1 ,+ N Will match .I addr1 and the .I N lines following .IR addr1 . .TP .IR addr1 ,~ N Will match .I addr1 and the lines following .I addr1 until the next line whose input line number is a multiple of .IR N . .SH "REGULAR EXPRESSIONS" POSIX.2 BREs .I should be supported, but they aren't completely because of performance problems. The .B \en sequence in a regular expression matches the newline character, and similarly for .BR \ea , .BR \et , and other sequences. .SH BUGS .PP E-mail bug reports to .BR bonzini@gnu.org . Be sure to include the word ``sed'' somewhere in the ``Subject:'' field. Also, please include the output of ``sed --version'' in the body of your report if at all possible. .SH COPYRIGHT Copyright \(co 2003 Free Software Foundation, Inc. .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. .SH "SEE ALSO" .BR awk (1), .BR ed (1), .BR grep (1), .BR tr (1), .BR perlre (1), sed.info, any of various books on \*(sd, .na the \*(sd FAQ (http://sed.sf.net/grabbag/tutorials/sedfaq.html), http://sed.sf.net/grabbag/. .PP The full documentation for .B super-sed is maintained as a Texinfo manual. If the .B info and .B super-sed programs are properly installed at your site, the command .IP .B info sed .PP should give you access to the complete manual. sed-3.62/doc/sed.info0000644000076600007660000041752310202173657011370 00000000000000This is ../../doc/sed.info, produced by makeinfo version 4.6 from ../../doc/sed.texi. INFO-DIR-SECTION Text creation and manipulation START-INFO-DIR-ENTRY * sed: (sed). Stream EDitor. END-INFO-DIR-ENTRY This file documents version 3.62 of `super-sed', a stream editor. Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This document is released under the terms of the GNU Free Documentation License as published by the Free Software Foundation; either version 1.1, or (at your option) any later version. You should have received a copy of the GNU Free Documentation License along with `super-sed'; see the file `COPYING.DOC'. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. There are no Cover Texts and no Invariant Sections; this text, along with its equivalent in the printed manual, constitutes the Title Page.  File: sed.info, Node: Top, Next: Introduction, Up: (dir) This file documents version 3.62 of `super-sed', a stream editor. Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This document is released under the terms of the GNU Free Documentation License as published by the Free Software Foundation; either version 1.1, or (at your option) any later version. You should have received a copy of the GNU Free Documentation License along with `super-sed'; see the file `COPYING.DOC'. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. There are no Cover Texts and no Invariant Sections; this text, along with its equivalent in the printed manual, constitutes the Title Page. * Menu: * Introduction:: Introduction * Invoking sed:: Invocation * sed Programs:: `sed' programs * Examples:: Some sample scripts * Limitations:: Limitations and (non-)limitations of `super-sed' * Other Resources:: Other resources for learning about `sed' * Reporting Bugs:: Reporting bugs * Extended regexps:: `egrep'-style regular expressions * Perl regexps:: Perl-style regular expressions * Concept Index:: A menu with all the topics in this manual. * Command and Option Index:: A menu with all `sed' commands and command-line options. --- The detailed node listing --- sed Programs: * Execution Cycle:: How `sed' works * Addresses:: Selecting lines with `sed' * Regular Expressions:: Overview of regular expression syntax * Common Commands:: Often used commands * The "s" Command:: `sed''s Swiss Army Knife * Other Commands:: Less frequently used commands * Programming Commands:: Commands for `sed' gurus * Extended Commands:: Commands specific of `super-sed' * Escapes:: Specifying special characters Examples: * Centering lines:: * Increment a number:: * Rename files to lower case:: * Print bash environment:: * Reverse chars of lines:: * tac:: Reverse lines of files * cat -n:: Numbering lines * cat -b:: Numbering non-blank lines * wc -c:: Counting chars * wc -w:: Counting words * wc -l:: Counting lines * head:: Printing the first lines * tail:: Printing the last lines * uniq:: Make duplicate lines unique * uniq -d:: Print duplicated lines of input * uniq -u:: Remove all duplicated lines * cat -s:: Squeezing blank lines Perl regexps:: Perl-style regular expressions * Backslash:: Introduces special sequences * Circumflex/dollar sign/period:: Behave specially with regard to new lines * Square brackets:: Are a bit different in strange cases * Options setting:: Toggle modifiers in the middle of a regexp * Non-capturing subpatterns:: Are not counted when backreferencing * Repetition:: Allows for non-greedy matching * Backreferences:: Allows for more than 10 back references * Assertions:: Allows for complex look ahead matches * Non-backtracking subpatterns:: Often gives more performance * Conditional subpatterns:: Allows if/then/else branches * Recursive patterns:: For example to match parentheses * Comments:: Because things can get complex...  File: sed.info, Node: Introduction, Next: Invoking sed, Prev: Top, Up: Top Introduction ************ `sed' is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as `ed'), `sed' works by making only one pass over the input(s), and is consequently more efficient. But it is `sed''s ability to filter text in a pipeline which particularly distinguishes it from other types of editors.  File: sed.info, Node: Invoking sed, Next: sed Programs, Prev: Introduction, Up: Top Invocation ********** Normally `sed' is invoked like this: sed SCRIPT INPUTFILE... The full format for invoking `sed' is: sed OPTIONS... [SCRIPT] [INPUTFILE...] If you do not specify INPUTFILE, or if INPUTFILE is `-', `sed' filters the contents of the standard input. The SCRIPT is actually the first non-option parameter, which `sed' specially considers a script and not an input file if (and only if) none of the other OPTIONS specifies a script to be executed, that is if neither of the `-e' and `-f' options is specified. `sed' may be invoked with the following command-line options: `--version' Print out the version of `sed' that is being run and a copyright notice, then exit. `--help' Print a usage message briefly summarizing these command-line options and the bug-reporting address, then exit. `-n' `--quiet' `--silent' By default, `sed' prints out the pattern space at the end of each cycle through the script. These options disable this automatic printing, and `sed' only produces output when explicitly told to via the `p' command. `-i[SUFFIX]' `--in-place[=SUFFIX]' This option specifies that files are to be edited in-place. `super-sed' does this by creating a temporary file and sending output to this file rather than to the standard output.(1). This option implies `-s'. When the end of the file is reached, the temporary file is renamed to the output file's original name. The extension, if supplied, is used to modify the name of the old file before renaming the temporary file, thereby making a backup copy(2)). This rule is followed: if the extension doesn't contain a `*', then it is appended to the end of the current filename as a suffix; if the extension does contain one or more `*' characters, then _each_ asterisk is replaced with the current filename. This allows you to add a prefix to the backup file, instead of (or in addition to) a suffix, or even to place backup copies of the original files into another directory (provided the directory already exists). If no extension is supplied, the original file is overwritten without making a backup. `-l N' `--line-length=N' Specify the default line-wrap length for the `l' command. A length of 0 (zero) means to never wrap long lines. If not specified, it is taken to be 70. `--posix' `super-sed' includes several extensions to POSIX sed. In order to simplify writing portable scripts, this option disables all the extensions that this manual documents, including additional commands. Most of the extensions accept `sed' programs that are outside the syntax mandated by POSIX, but some of them (such as the behavior of the `N' command described in *note Reporting Bugs::) actually violate the standard. If you want to disable only the latter kind of extension, you can set the `POSIXLY_CORRECT' variable to a non-empty value. `-r' `--regexp-extended' Use extended regular expressions rather than basic regular expressions. Extended regexps are those that `egrep' accepts; they can be clearer because they usually have less backslashes, but are a GNU extension and hence scripts that use them are not portable. *Note Extended regular expressions: Extended regexps. `-R' `--regexp-perl' Use Perl-style regular expressions rather than basic regular expressions. Perl-style regexps are extremely powerful but are a `super-sed' extension and hence scripts that use it are not portable. *Note Perl-style regular expressions: Perl regexps. `-s' `--separate' By default, `sed' will consider the files specified on the command line as a single continuous long stream. This `super-sed' extension allows the user to consider them as separate files: range addresses (such as `/abc/,/def/') are not allowed to span several files, line numbers are relative to the start of each file, `$' refers to the last line of each file, and files invoked from the `R' commands are rewound at the start of each file. `-u' `--unbuffered' Buffer both input and output as minimally as practical. (This is particularly useful if the input is coming from the likes of `tail -f', and you wish to see the transformed output as soon as possible.) `-e SCRIPT' `--expression=SCRIPT' Add the commands in SCRIPT to the set of commands to be run while processing the input. `-f SCRIPT-FILE' `--file=SCRIPT-FILE' Add the commands contained in the file SCRIPT-FILE to the set of commands to be run while processing the input. If no `-e', `-f', `--expression', or `--file' options are given on the command-line, then the first non-option argument on the command line is taken to be the SCRIPT to be executed. If any command-line parameters remain after processing the above, these parameters are interpreted as the names of input files to be processed. A file name of `-' refers to the standard input stream. The standard input will be processed if no file names are specified. ---------- Footnotes ---------- (1) This applies to commands such as `=', `a', `c', `i', `l', `p'. You can still write to the standard output by using the `w' or `W' commands together with the `/dev/stdout' special file (2) Note that `super-sed' creates the backup file whether or not any output is actually changed.  File: sed.info, Node: sed Programs, Next: Examples, Prev: Invoking sed, Up: Top `sed' Programs ************** A `sed' program consists of one or more `sed' commands, passed in by one or more of the `-e', `-f', `--expression', and `--file' options, or the first non-option argument if zero of these options are used. This document will refer to "the" `sed' script; this is understood to mean the in-order catenation of all of the SCRIPTs and SCRIPT-FILEs passed in. Each `sed' command consists of an optional address or address range, followed by a one-character command name and any additional command-specific code. * Menu: * Execution Cycle:: How `sed' works * Addresses:: Selecting lines with `sed' * Regular Expressions:: Overview of regular expression syntax * Common Commands:: Often used commands * The "s" Command:: `sed''s Swiss Army Knife * Other Commands:: Less frequently used commands * Programming Commands:: Commands for `sed' gurus * Extended Commands:: Commands specific of `super-sed' * Escapes:: Specifying special characters  File: sed.info, Node: Execution Cycle, Next: Addresses, Up: sed Programs How `sed' Works =============== `sed' maintains two data buffers: the active _pattern_ space, and the auxiliary _hold_ space. Both are initially empty. `sed' operates by performing the following cycle on each lines of input: first, `sed' reads one line from the input stream, removes any trailing newline, and places it in the pattern space. Then commands are executed; each command can have an address associated to it: addresses are a kind of condition code, and a command is only executed if the condition is verified before the command is to be executed. When the end of the script is reached, unless the `-n' option is in use, the contents of pattern space are printed out to the output stream, adding back the trailing newline if it was removed.(1) Then the next cycle starts for the next input line. Unless special commands (like `D') are used, the pattern space is deleted between two cycles. The hold space, on the other hand, keeps its data between cycles (see commands `h', `H', `x', `g', `G' to move data between both buffers). ---------- Footnotes ---------- (1) Actually, if `sed' prints a line without the terminating newline, it will nevertheless print the missing newline as soon as more text is sent to the same output stream, which gives the "least expected surprise" even though it does not make commands like `sed -n p' exactly identical to `cat'.  File: sed.info, Node: Addresses, Next: Regular Expressions, Prev: Execution Cycle, Up: sed Programs Selecting lines with `sed' ========================== Addresses in a `sed' script can be in any of the following forms: `NUMBER' Specifying a line number will match only that line in the input. (Note that `sed' counts lines continuously across all input files unless `-i' or `-s' options are specified.) `FIRST~STEP' This GNU extension matches every STEPth line starting with line FIRST. In particular, lines will be selected when there exists a non-negative N such that the current line-number equals FIRST + (N * STEP). Thus, to select the odd-numbered lines, one would use `1~2'; to pick every third line starting with the second, `2~3' would be used; to pick every fifth line starting with the tenth, use `10~5'; and `50~0' is just an obscure way of saying `50'. `$' This address matches the last line of the last file of input, or the last line of each file when the `-i' or `-s' options are specified. `/REGEXP/' This will select any line which matches the regular expression REGEXP. If REGEXP itself includes any `/' characters, each must be escaped by a backslash (`\'). The empty regular expression `//' repeats the last regular expression match (the same holds if the empty regular expression is passed to the `s' command). Note that modifiers to regular expressions are evaluated when the regular expression is compiled, thus it is invalid to specify them together with the empty regular expression. `\%REGEXP%' (The `%' may be replaced by any other single character.) This also matches the regular expression REGEXP, but allows one to use a different delimiter than `/'. This is particularly useful if the REGEXP itself contains a lot of slashes, since it avoids the tedious escaping of every `/'. If REGEXP itself includes any delimiter characters, each must be escaped by a backslash (`\'). `/REGEXP/I' `\%REGEXP%I' The `I' modifier to regular-expression matching is a GNU extension which causes the REGEXP to be matched in a case-insensitive manner. `/REGEXP/M' `\%REGEXP%M' The `M' modifier to regular-expression matching is a `super-sed' extension which causes `^' and `$' to match respectively (in addition to the normal behavior) the empty string after a newline, and the empty string before a newline. There are special character sequences (`\A' and `\Z' in Perl mode, `\`' and `\'' in basic or extended regular expression modes) which always match the beginning or the end of the buffer. `M' stands for `multi-line'. `/REGEXP/S' `\%REGEXP%S' The `S' modifier to regular-expression matching is only valid in Perl mode and specifies that the dot character (`.') will match the newline character too. `S' stands for `single-line'. `/REGEXP/X' `\%REGEXP%X' The `X' modifier to regular-expression matching is also valid in Perl mode only. If it is used, whitespace in the pattern (other than in a character class) and characters between a `#' outside a character class and the next newline character are ignored. An escaping backslash can be used to include a whitespace or `#' character as part of the pattern. If no addresses are given, then all lines are matched; if one address is given, then only lines matching that address are matched. An address range can be specified by specifying two addresses separated by a comma (`,'). An address range matches lines starting from where the first address matches, and continues until the second address matches (inclusively). If the second address is a REGEXP, then checking for the ending match will start with the line _following_ the line which matched the first address: a range will always span at least two lines (except of course if the input stream ends). If the second address is a NUMBER less than (or equal to) the line matching the first address, then only the one line is matched. `super-sed' also supports some special two-address forms; all these are GNU extensions: `0,/REGEXP/' A line number of `0' can be used in an address specification like `0,/REGEXP/' so that `sed' will try to match REGEXP in the first input line too. In other words, `0,/REGEXP/' is similar to `1,/REGEXP/', except that if ADDR2 matches the very first line of input the `0,/REGEXP/' form will consider it to end the range, whereas the `1,/REGEXP/' form will match the beginning of its range and hence make the range span up to the _second_ occurrence of the regular expression. Note that this is the only place where the `0' address makes sense; there is no 0-th line and commands which are given the `0' address in any other way will give an error. `ADDR1,+N' Matches ADDR1 and the N lines following ADDR1. `ADDR1,~N' Matches ADDR1 and the lines following ADDR1 until the next line whose input line number is a multiple of N. Appending the `!' character to the end of an address specification negates the sense of the match. That is, if the `!' character follows an address range, then only lines which do _not_ match the address range will be selected. This also works for singleton addresses, and, perhaps perversely, for the null address.  File: sed.info, Node: Regular Expressions, Next: Common Commands, Prev: Addresses, Up: sed Programs Overview of Regular Expression Syntax ===================================== To know how to use `sed', people should understand regular expressions ("regexp" for short). A regular expression is a pattern that is matched against a subject string from left to right. Most characters are "ordinary": they stand for themselves in a pattern, and match the corresponding characters in the subject. As a trivial example, the pattern The quick brown fox matches a portion of a subject string that is identical to itself. The power of regular expressions comes from the ability to include alternatives and repetitions in the pattern. These are encoded in the pattern by the use of "special characters", which do not stand for themselves but instead are interpreted in some special way. Here is a brief description of regular expression syntax as used in `sed'. `CHAR' A single ordinary character matches itself. `*' Matches a sequence of zero or more instances of matches for the preceding regular expression, which must be an ordinary character, a special character preceded by `\', a `.', a grouped regexp (see below), or a bracket expression. As a GNU extension, a postfixed regular expression can also be followed by `*'; for example, `a**' is equivalent to `a*'. POSIX 1003.1-2001 says that `*' stands for itself when it appears at the start of a regular expression or subexpression, but many nonGNU implementations do not support this and portable scripts should instead use `\*' in these contexts. `\+' As `*', but matches one or more. It is a GNU extension. `\?' As `*', but only matches zero or one. It is a GNU extension. `\{I\}' As `*', but matches exactly I sequences (I is a decimal integer; for portability, keep it between 0 and 255 inclusive). `\{I,J\}' Matches between I and J, inclusive, sequences. `\{I,\}' Matches more than or equal to I sequences. `\(REGEXP\)' Groups the inner REGEXP as a whole, this is used to: * Apply postfix operators, like `\(abcd\)*': this will search for zero or more whole sequences of `abcd', while `abcd*' would search for `abc' followed by zero or more occurrences of `d'. Note that support for `\(abcd\)*' is required by POSIX 1003.1-2001, but many non-GNU implementations do not support it and hence it is not universally portable. * Use back references (see below). `.' Matches any character, including newline. `^' Matches the null string at beginning of line, i.e. what appears after the circumflex must appear at the beginning of line. `^#include' will match only lines where `#include' is the first thing on line--if there are spaces before, for example, the match fails. `^' acts as a special character only at the beginning of the regular expression or subexpression (that is, after `\(' or `\|'). Portable scripts should avoid `^' at the beginning of a subexpression, though, as POSIX allows implementations that treat `^' as an ordinary character in that context. `$' It is the same as `^', but refers to end of line. `$' also acts as a special character only at the end of the regular expression or subexpression (that is, before `\)' or `\|'), and its use at the end of a subexpression is not portable. `[LIST]' `[^LIST]' Matches any single character in LIST: for example, `[aeiou]' matches all vowels. A list may include sequences like `CHAR1-CHAR2', which matches any character between (inclusive) CHAR1 and CHAR2. A leading `^' reverses the meaning of LIST, so that it matches any single character _not_ in LIST. To include `]' in the list, make it the first character (after the `^' if needed), to include `-' in the list, make it the first or last; to include `^' put it after the first character. The characters `$', `*', `.', `[', and `\' are normally not special within LIST. For example, `[\*]' matches either `\' or `*', because the `\' is not special here. However, strings like `[.ch.]', `[=a=]', and `[:space:]' are special within LIST and represent collating symbols, equivalence classes, and character classes, respectively, and `[' is therefore special within LIST when it is followed by `.', `=', or `:'. Also, when not in `POSIXLY_CORRECT' mode, special escapes like `\n' and `\t' are recognized within LIST. *Note Escapes::. `REGEXP1\|REGEXP2' Matches either REGEXP1 or REGEXP2. Use parentheses to use complex alternative regular expressions. The matching process tries each alternative in turn, from left to right, and the first one that succeeds is used. It is a GNU extension. `REGEXP1REGEXP2' Matches the concatenation of REGEXP1 and REGEXP2. Concatenation binds more tightly than `\|', `^', and `$', but less tightly than the other regular expression operators. `\DIGIT' Matches the DIGIT-th `\(...\)' parenthesized subexpression in the regular expression. This is called a "back reference". Subexpressions are implicity numbered by counting occurrences of `\(' left-to-right. `\n' Matches the newline character. `\CHAR' Matches CHAR, where CHAR is one of `$', `*', `.', `[', `\', or `^'. Note that the only C-like backslash sequences that you can portably assume to be interpreted are `\n' and `\\'; in particular `\t' is not portable, and matches a `t' under most implementations of `sed', rather than a tab character. Note that the regular expression matcher is greedy, i.e., matches are attempted from left to right and, if two or more matches are possible starting at the same character, it selects the longest. Examples: `abcdef' Matches `abcdef'. `a*b' Matches zero or more `a's followed by a single `b'. For example, `b' or `aaaaab'. `a\?b' Matches `b' or `ab'. `a\+b\+' Matches one or more `a's followed by one or more `b's: `ab' is the shortest possible match, but other examples are `aaaab' or `abbbbb' or `aaaaaabbbbbbb'. `.*' `.\+' These two both match all the characters in a string; however, the first matches every string (including the empty string), while the second matches only strings containing at least one character. `^main.*(.*)' his matches a string starting with `main', followed by an opening and closing parenthesis. The `n', `(' and `)' need not be adjacent. `^#' This matches a string beginning with `#'. `\\$' This matches a string ending with a single backslash. The regexp contains two backslashes for escaping. `\$' Instead, this matches a string consisting of a single dollar sign, because it is escaped. `[a-zA-Z0-9]' In the C locale, this matches any ASCII letters or digits. `[^ tab]\+' (Here `tab' stands for a single tab character.) This matches a string of one or more characters, none of which is a space or a tab. Usually this means a word. `^\(.*\)\n\1$' This matches a string consisting of two equal substrings separated by a newline. `.\{9\}A$' This matches nine characters followed by an `A'. `^.\{15\}A' This matches the start of a string that contains 16 characters, the last of which is an `A'.  File: sed.info, Node: Common Commands, Next: The "s" Command, Prev: Regular Expressions, Up: sed Programs Often-Used Commands =================== If you use `sed' at all, you will quite likely want to know these commands. `#' [No addresses allowed.] The `#' character begins a comment; the comment continues until the next newline. If you are concerned about portability, be aware that some implementations of `sed' (which are not POSIX conformant) may only support a single one-line comment, and then only when the very first character of the script is a `#'. Warning: if the first two characters of the `sed' script are `#n', then the `-n' (no-autoprint) option is forced. If you want to put a comment in the first line of your script and that comment begins with the letter `n' and you do not want this behavior, then be sure to either use a capital `N', or place at least one space before the `n'. `q [EXIT-CODE]' This command only accepts a single address. Exit `sed' without processing any more commands or input. Note that the current pattern space is printed if auto-print is not disabled with the `-n' options. The ability to return an exit code from the `sed' script is a `super-sed' extension. `d' Delete the pattern space; immediately start next cycle. `p' Print out the pattern space (to the standard output). This command is usually only used in conjunction with the `-n' command-line option. `n' If auto-print is not disabled, print the pattern space, then, regardless, replace the pattern space with the next line of input. If there is no more input then `sed' exits without processing any more commands. `{ COMMANDS }' A group of commands may be enclosed between `{' and `}' characters. This is particularly useful when you want a group of commands to be triggered by a single address (or address-range) match.  File: sed.info, Node: The "s" Command, Next: Other Commands, Prev: Common Commands, Up: sed Programs The `s' Command =============== The syntax of the `s' (as in substitute) command is `s/REGEXP/REPLACEMENT/FLAGS'. The `/' characters may be uniformly replaced by any other single character within any given `s' command. The `/' character (or whatever other character is used in its stead) can appear in the REGEXP or REPLACEMENT only if it is preceded by a `\' character. The `s' command is probably the most important in `sed' and has a lot of different options. Its basic concept is simple: the `s' command attempts to match the pattern space against the supplied REGEXP; if the match is successful, then that portion of the pattern space which was matched is replaced with REPLACEMENT. The REPLACEMENT can contain `\N' (N being a number from 1 to 9, inclusive) references, which refer to the portion of the match which is contained between the Nth `\(' and its matching `\)'. Also, the REPLACEMENT can contain unescaped `&' characters which reference the whole matched portion of the pattern space. Finally, as a `super-sed' extension, you can include a special sequence made of a backslash and one of the letters `L', `l', `U', `u', or `E'. The meaning is as follows: `\L' Turn the replacement to lowercase until a `\U' or `\E' is found, `\l' Turn the next character to lowercase, `\U' Turn the replacement to uppercase until a `\L' or `\E' is found, `\u' Turn the next character to uppercase, `\E' Stop case conversion started by `\L' or `\U'. To include a literal `\', `&', or newline in the final replacement, be sure to precede the desired `\', `&', or newline in the REPLACEMENT with a `\'. The `s' command can be followed by zero or more of the following FLAGS: `g' Apply the replacement to _all_ matches to the REGEXP, not just the first. `NUMBER' Only replace the NUMBERth match of the REGEXP. Note: the POSIX standard does not specify what should happen when you mix the `g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across `sed' implementations. For `super-sed', the interaction is defined to be: ignore matches before the NUMBERth, and then match and replace all matches from the NUMBERth on. `p' If the substitution was made, then print the new pattern space. Note: when both the `p' and `e' options are specified, the relative ordering of the two produces very different results. In general, `ep' (evaluate then print) is what you want, but operating the other way round can be useful for debugging. For this reason, the current version of `super-sed' interprets specially the presence of `p' options both before and after `e', printing the pattern space before and after evaluation, while in general flags for the `s' command show their effect just once. This behavior, although documented, might change in future versions. `w FILE-NAME' If the substitution was made, then write out the result to the named file. As a `super-sed' extension, two special values of FILE-NAME are supported: `/dev/stderr', which writes the result to the standard error, and `/dev/stdout', which writes to the standard output.(1) `e' This command allows one to pipe input from a shell command into pattern space. If a substitution was made, the command that is found in pattern space is executed and pattern space is replaced with its output. A trailing newline is suppressed; results are undefined if the command to be executed contains a NUL character. This is a `super-sed' extension. `I' `i' The `I' modifier to regular-expression matching is a GNU extension which makes `sed' match REGEXP in a case-insensitive manner. `M' `m' The `M' modifier to regular-expression matching is a `super-sed' extension which causes `^' and `$' to match respectively (in addition to the normal behavior) the empty string after a newline, and the empty string before a newline. There are special character sequences (`\A' and `\Z' in Perl mode, `\`' and `\'' in basic or extended regular expression modes) which always match the beginning or the end of the buffer. `M' stands for `multi-line'. `S' `s' The `S' modifier to regular-expression matching is only valid in Perl mode and specifies that the dot character (`.') will match the newline character too. `S' stands for `single-line'. `X' `x' The `X' modifier to regular-expression matching is also valid in Perl mode only. If it is used, whitespace in the pattern (other than in a character class) and characters between a `#' outside a character class and the next newline character are ignored. An escaping backslash can be used to include a whitespace or `#' character as part of the pattern. ---------- Footnotes ---------- (1) This is equivalent to `p' unless the `-i' option is being used.  File: sed.info, Node: Other Commands, Next: Programming Commands, Prev: The "s" Command, Up: sed Programs Less Frequently-Used Commands ============================= Though perhaps less frequently used than those in the previous section, some very small yet useful `sed' scripts can be built with these commands. `y/SOURCE-CHARS/DEST-CHARS/' (The `/' characters may be uniformly replaced by any other single character within any given `y' command.) Transliterate any characters in the pattern space which match any of the SOURCE-CHARS with the corresponding character in DEST-CHARS. Instances of the `/' (or whatever other character is used in its stead), `\', or newlines can appear in the SOURCE-CHARS or DEST-CHARS lists, provide that each instance is escaped by a `\'. The SOURCE-CHARS and DEST-CHARS lists _must_ contain the same number of characters (after de-escaping). `a\' `TEXT' As a GNU extension, this command accepts two addresses. Queue the lines of text which follow this command (each but the last ending with a `\', which are removed from the output) to be output at the end of the current cycle, or when the next input line is read. Escape sequences in TEXT are processed, so you should use `\\' in TEXT to print a single backslash. As a GNU extension, if between the `a' and the newline there is other than a whitespace-`\' sequence, then the text of this line, starting at the first non-whitespace character after the `a', is taken as the first line of the TEXT block. (This enables a simplification in scripting a one-line add.) This extension also works with the `i' and `c' commands. `i\' `TEXT' As a GNU extension, this command accepts two addresses. Immediately output the lines of text which follow this command (each but the last ending with a `\', which are removed from the output). `c\' `TEXT' Delete the lines matching the address or address-range, and output the lines of text which follow this command (each but the last ending with a `\', which are removed from the output) in place of the last line (or in place of each line, if no addresses were specified). A new cycle is started after this command is done, since the pattern space will have been deleted. `=' As a GNU extension, this command accepts two addresses. Print out the current input line number (with a trailing newline). `l N' Print the pattern space in an unambiguous form: non-printable characters (and the `\' character) are printed in C-style escaped form; long lines are split, with a trailing `\' character to indicate the split; the end of each line is marked with a `$'. N specifies the desired line-wrap length; a length of 0 (zero) means to never wrap long lines. If omitted, the default as specified on the command line is used. The N parameter is a `super-sed' extension. `r FILENAME' As a GNU extension, this command accepts two addresses. Queue the contents of FILENAME to be read and inserted into the output stream at the end of the current cycle, or when the next input line is read. Note that if FILENAME cannot be read, it is treated as if it were an empty file, without any error indication. As a `super-sed' extension, the special value `/dev/stdin' is supported for the file name, which reads the contents of the standard input. `w FILENAME' Write the pattern space to FILENAME. As a `super-sed' extension, two special values of FILE-NAME are supported: `/dev/stderr', which writes the result to the standard error, and `/dev/stdout', which writes to the standard output.(1) The file will be created (or truncated) before the first input line is read; all `w' commands (including instances of `w' flag on successful `s' commands) which refer to the same FILENAME are output without closing and reopening the file. `D' Delete text in the pattern space up to the first newline. If any text is left, restart cycle with the resultant pattern space (without reading a new line of input), otherwise start a normal new cycle. `N' Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then `sed' exits without processing any more commands. `P' Print out the portion of the pattern space up to the first newline. `h' Replace the contents of the hold space with the contents of the pattern space. `H' Append a newline to the contents of the hold space, and then append the contents of the pattern space to that of the hold space. `g' Replace the contents of the pattern space with the contents of the hold space. `G' Append a newline to the contents of the pattern space, and then append the contents of the hold space to that of the pattern space. `x' Exchange the contents of the hold and pattern spaces. ---------- Footnotes ---------- (1) This is equivalent to `p' unless the `-i' option is being used.  File: sed.info, Node: Programming Commands, Next: Extended Commands, Prev: Other Commands, Up: sed Programs Commands for `sed' gurus ======================== In most cases, use of these commands indicates that you are probably better off programming in something like `awk' or Perl. But occasionally one is committed to sticking with `sed', and these commands can enable one to write quite convoluted scripts. `: LABEL' [No addresses allowed.] Specify the location of LABEL for branch commands. In all other respects, a no-op. `b LABEL' Unconditionally branch to LABEL. The LABEL may be omitted, in which case the next cycle is started. `t LABEL' Branch to LABEL only if there has been a successful `s'ubstitution since the last input line was read or conditional branch was taken. The LABEL may be omitted, in which case the next cycle is started.  File: sed.info, Node: Extended Commands, Next: Escapes, Prev: Programming Commands, Up: sed Programs Commands Specific to `super-sed' ================================ These commands are specific to `super-sed', so you must use them with care and only when you are sure that hindering portability is not evil. They allow you to check for `super-sed' extensions or to do tasks that are required quite often, yet are unsupported by standard `sed's. `e [COMMAND]' This command allows one to pipe input from a shell command into pattern space. Without parameters, the `e' command executes the command that is found in pattern space and replaces the pattern space with the output; a trailing newline is suppressed. If a parameter is specified, instead, the `e' command interprets it as a command and sends its output to the output stream (like `r' does). The command can run across multiple lines, all but the last ending with a back-slash. In both cases, the results are undefined if the command to be executed contains a NUL character. `L N' This `super-sed' extension fills and joins lines in pattern space to produce output lines of (at most) N characters, like `fmt' does; if N is omitted, the default as specified on the command line is used. This command is considered a failed experiment and unless there is enough request (which seems unlikely) will be removed in future versions. `Q [EXIT-CODE]' This command only accepts a single address. This command is the same as `q', but will not print the contents of pattern space. Like `q', it provides the ability to return an exit code to the caller. This command can be useful because the only alternative ways to accomplish this apparently trivial function are to use the `-n' option (which can unnecessarily complicate your script) or resorting to the following snippet, which wastes time by reading the whole file without any visible effect: :eat $d Quit silently on the last line N Read another line, silently g Overwrite pattern space each time to save memory b eat `R FILENAME' Queue a line of FILENAME to be read and inserted into the output stream at the end of the current cycle, or when the next input line is read. Note that if FILENAME cannot be read, or if its end is reached, no line is appended, without any error indication. As with the `r' command, the special value `/dev/stdin' is supported for the file name, which reads a line from the standard input. `T LABEL' Branch to LABEL only if there have been no successful `s'ubstitutions since the last input line was read or conditional branch was taken. The LABEL may be omitted, in which case the next cycle is started. `v VERSION' This command does nothing, but makes `sed' fail if `super-sed' extensions are not supported, simply because other versions of `sed' do not implement it. In addition, you can specify the version of `sed' that your script requires, such as `4.0.5'. The default is `4.0' because that is the first version that implemented this command. This command enables all ssed extensions even if `POSIXLY_CORRECT' is set in the environment. `W FILENAME' Write to the given filename the portion of the pattern space up to the first newline. Everything said under the `w' command about file handling holds here too.  File: sed.info, Node: Escapes, Prev: Extended Commands, Up: sed Programs GNU Extensions for Escapes in Regular Expressions ================================================= Until this chapter, we have only encountered escapes of the form `\^', which tell `sed' not to interpret the circumflex as a special character, but rather to take it literally. For example, `\*' matches a single asterisk rather than zero or more backslashes. This chapter introduces another kind of escape(1)--that is, escapes that are applied to a character or sequence of characters that ordinarily are taken literally, and that `sed' replaces with a special character. This provides a way of encoding non-printable characters in patterns in a visible manner. There is no restriction on the appearance of non-printing characters in a `sed' script but when a script is being prepared in the shell or by text editing, it is usually easier to use one of the following escape sequences than the binary character it represents: The list of these escapes is: `\a' Produces or matches a BEL character, that is an "alert" (ASCII 7). `\f' Produces or matches a form feed (ASCII 12). `\n' Produces or matches a newline (ASCII 10). `\r' Produces or matches a carriage return (ASCII 13). `\t' Produces or matches a horizontal tab (ASCII 9). `\v' Produces or matches a so called "vertical tab" (ASCII 11). `\cX' Produces or matches `CONTROL-X', where X is any character. The precise effect of `\cX' is as follows: if X is a lower case letter, it is converted to upper case. Then bit 6 of the character (hex 40) is inverted. Thus `\cz' becomes hex 1A, but `\c{' becomes hex 3B, while `\c;' becomes hex 7B. `\dXXX' Produces or matches a character whose decimal ASCII value is XXX. `\oXXX' `\XXX' Produces or matches a character whose octal ASCII value is XXX. The syntax without the `o' is active in Perl mode, while the one with the `o' is active in the normal or extended POSIX regular expression modes. `\xXX' Produces or matches a character whose hexadecimal ASCII value is XX. `\b' (backspace) was omitted because of the conflict with the existing "word boundary" meaning. Other escapes match a particular character class and are valid only in regular expressions: `\w' Matches any "word" character. A "word" character is any letter or digit or the underscore character. `\W' Matches any "non-word" character. `\b' Matches a word boundary; that is it matches if the character to the left is a "word" character and the character to the right is a "non-word" character, or vice-versa. `\B' Matches everywhere but on a word boundary; that is it matches if the character to the left and the character to the right are either both "word" characters or both "non-word" characters. `\`' Matches only at the start of pattern space. This is different from `^' in multi-line mode. `\'' Matches only at the end of pattern space. This is different from `$' in multi-line mode. `\G' Match only at the start of pattern space or, when doing a global substitution using the `s///g' command and option, at the end-of-match position of the prior match. For example, `s/\Ga/Z/g' will change an initial run of `a's to a run of `Z's ---------- Footnotes ---------- (1) All the escapes introduced here are GNU extensions, with the exception of `\n'. In basic regular expression mode, setting `POSIXLY_CORRECT' disables them inside bracket expressions.  File: sed.info, Node: Examples, Next: Limitations, Prev: sed Programs, Up: Top Some Sample Scripts ******************* Here are some `sed' scripts to guide you in the art of mastering `sed'. * Menu: Some exotic examples: * Centering lines:: * Increment a number:: * Rename files to lower case:: * Print bash environment:: * Reverse chars of lines:: Emulating standard utilities: * tac:: Reverse lines of files * cat -n:: Numbering lines * cat -b:: Numbering non-blank lines * wc -c:: Counting chars * wc -w:: Counting words * wc -l:: Counting lines * head:: Printing the first lines * tail:: Printing the last lines * uniq:: Make duplicate lines unique * uniq -d:: Print duplicated lines of input * uniq -u:: Remove all duplicated lines * cat -s:: Squeezing blank lines  File: sed.info, Node: Centering lines, Next: Increment a number, Up: Examples Centering Lines =============== This script centers all lines of a file on a 80 columns width. To change that width, the number in `\{...\}' must be replaced, and the number of added spaces also must be changed. Note how the buffer commands are used to separate parts in the regular expressions to be matched--this is a common technique. #!/usr/bin/sed -f # Put 80 spaces in the buffer 1 { x s/^$/ / s/^.*$/&&&&&&&&/ x } # del leading and trailing spaces y/tab/ / s/^ *// s/ *$// # add a newline and 80 spaces to end of line G # keep first 81 chars (80 + a newline) s/^\(.\{81\}\).*$/\1/ # \2 matches half of the spaces, which are moved to the beginning s/^\(.*\)\n\(.*\)\2/\2\1/  File: sed.info, Node: Increment a number, Next: Rename files to lower case, Prev: Centering lines, Up: Examples Increment a Number ================== This script is one of a few that demonstrate how to do arithmetic in `sed'. This is indeed possible,(1) but must be done manually. To increment one number you just add 1 to last digit, replacing it by the following digit. There is one exception: when the digit is a nine the previous digits must be also incremented until you don't have a nine. This solution by Bruno Haible is very clever and smart because it uses a single buffer; if you don't have this limitation, the algorithm used in *Note Numbering lines: cat -n, is faster. It works by replacing trailing nines with an underscore, then using multiple `s' commands to increment the last digit, and then again substituting underscores with zeros. #!/usr/bin/sed -f /[^0-9]/ d # replace all leading 9s by _ (any other character except digits, could # be used) :d s/9\(_*\)$/_\1/ td # incr last digit only. The first line adds a most-significant # digit of 1 if we have to add a digit. # # The `tn' commands are not necessary, but make the thing # faster s/^\(_*\)$/1\1/; tn s/8\(_*\)$/9\1/; tn s/7\(_*\)$/8\1/; tn s/6\(_*\)$/7\1/; tn s/5\(_*\)$/6\1/; tn s/4\(_*\)$/5\1/; tn s/3\(_*\)$/4\1/; tn s/2\(_*\)$/3\1/; tn s/1\(_*\)$/2\1/; tn s/0\(_*\)$/1\1/; tn :n y/_/0/ ---------- Footnotes ---------- (1) `sed' guru Greg Ubben wrote an implementation of the `dc' RPN calculator! It is distributed together with sed.  File: sed.info, Node: Rename files to lower case, Next: Print bash environment, Prev: Increment a number, Up: Examples Rename Files to Lower Case ========================== This is a pretty strange use of `sed'. We transform text, and transform it to be shell commands, then just feed them to shell. Don't worry, even worse hacks are done when using `sed'; I have seen a script converting the output of `date' into a `bc' program! The main body of this is the `sed' script, which remaps the name from lower to upper (or vice-versa) and even checks out if the remapped name is the same as the original name. Note how the script is parameterized using shell variables and proper quoting. #! /bin/sh # rename files to lower/upper case... # # usage: # move-to-lower * # move-to-upper * # or # move-to-lower -R . # move-to-upper -R . # help() { cat << eof Usage: $0 [-n] [-r] [-h] files... -n do nothing, only see what would be done -R recursive (use find) -h this message files files to remap to lower case Examples: $0 -n * (see if everything is ok, then...) $0 * $0 -R . eof } apply_cmd='sh' finder='echo "$@" | tr " " "\n"' files_only= while : do case "$1" in -n) apply_cmd='cat' ;; -R) finder='find "$@" -type f';; -h) help ; exit 1 ;; *) break ;; esac shift done if [ -z "$1" ]; then echo Usage: $0 [-h] [-n] [-r] files... exit 1 fi LOWER='abcdefghijklmnopqrstuvwxyz' UPPER='ABCDEFGHIJKLMNOPQRSTUVWXYZ' case `basename $0` in *upper*) TO=$UPPER; FROM=$LOWER ;; *) FROM=$UPPER; TO=$LOWER ;; esac eval $finder | sed -n ' # remove all trailing slashes s/\/*$// # add ./ if there is no path, only a filename /\//! s/^/.\// # save path+filename h # remove path s/.*\/// # do conversion only on filename y/'$FROM'/'$TO'/ # now line contains original path+file, while # hold space contains the new filename x # add converted file name to line, which now contains # path/file-name\nconverted-file-name G # check if converted file name is equal to original file name, # if it is, do not print nothing /^.*\/\(.*\)\n\1/b # now, transform path/fromfile\n, into # mv path/fromfile path/tofile and print it s/^\(.*\/\)\(.*\)\n\(.*\)$/mv \1\2 \1\3/p ' | $apply_cmd  File: sed.info, Node: Print bash environment, Next: Reverse chars of lines, Prev: Rename files to lower case, Up: Examples Print `bash' Environment ======================== This script strips the definition of the shell functions from the output of the `set' Bourne-shell command. #!/bin/sh set | sed -n ' :x # if no occurrence of "=()" print and load next line /=()/! { p; b; } / () $/! { p; b; } # possible start of functions section # save the line in case this is a var like FOO="() " h # if the next line has a brace, we quit because # nothing comes after functions n /^{/ q # print the old line x; p # work on the new line now x; bx '  File: sed.info, Node: Reverse chars of lines, Next: tac, Prev: Print bash environment, Up: Examples Reverse Characters of Lines =========================== This script can be used to reverse the position of characters in lines. The technique moves two characters at a time, hence it is faster than more intuitive implementations. Note the `tx' command before the definition of the label. This is often needed to reset the flag that is tested by the `t' command. Imaginative readers will find uses for this script. An example is reversing the output of `banner'.(1) #!/usr/bin/sed -f /../! b # Reverse a line. Begin embedding the line between two newlines s/^.*$/\ &\ / # Move first character at the end. The regexp matches until # there are zero or one characters between the markers tx :x s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/ tx # Remove the newline markers s/\n//g ---------- Footnotes ---------- (1) This requires another script to pad the output of banner; for example #! /bin/sh banner -w $1 $2 $3 $4 | sed -e :a -e '/^.\{0,'$1'\}$/ { s/$/ /; ba; }' | ~/sedscripts/reverseline.sed  File: sed.info, Node: tac, Next: cat -n, Prev: Reverse chars of lines, Up: Examples Reverse Lines of Files ====================== This one begins a series of totally useless (yet interesting) scripts emulating various Unix commands. This, in particular, is a `tac' workalike. Note that on implementations other than GNU `sed' and `super-sed' this script might easily overflow internal buffers. #!/usr/bin/sed -nf # reverse all lines of input, i.e. first line became last, ... # from the second line, the buffer (which contains all previous lines) # is *appended* to current line, so, the order will be reversed 1! G # on the last line we're done -- print everything $ p # store everything on the buffer again h  File: sed.info, Node: cat -n, Next: cat -b, Prev: tac, Up: Examples Numbering Lines =============== This script replaces `cat -n'; in fact it formats its output exactly like GNU `cat' does. Of course this is completely useless and for two reasons: first, because somebody else did it in C, second, because the following Bourne-shell script could be used for the same purpose and would be much faster: #! /bin/sh sed -e "=" $@ | sed -e ' s/^/ / N s/^ *\(......\)\n/\1 / ' It uses `sed' to print the line number, then groups lines two by two using `N'. Of course, this script does not teach as much as the one presented below. The algorithm used for incrementing uses both buffers, so the line is printed as soon as possible and then discarded. The number is split so that changing digits go in a buffer and unchanged ones go in the other; the changed digits are modified in a single step (using a `y' command). The line number for the next line is then composed and stored in the hold space, to be used in the next iteration. #!/usr/bin/sed -nf # Prime the pump on the first line x /^$/ s/^.*$/1/ # Add the correct line number before the pattern G h # Format it and print it s/^/ / s/^ *\(......\)\n/\1 /p # Get the line number from hold space; add a zero # if we're going to add a digit on the next line g s/\n.*$// /^9*$/ s/^/0/ # separate changing/unchanged digits with an x s/.9*$/x&/ # keep changing digits in hold space h s/^.*x// y/0123456789/1234567890/ x # keep unchanged digits in pattern space s/x.*$// # compose the new number, remove the newline implicitly added by G G s/\n// h  File: sed.info, Node: cat -b, Next: wc -c, Prev: cat -n, Up: Examples Numbering Non-blank Lines ========================= Emulating `cat -b' is almost the same as `cat -n'--we only have to select which lines are to be numbered and which are not. The part that is common to this script and the previous one is not commented to show how important it is to comment `sed' scripts properly... #!/usr/bin/sed -nf /^$/ { p b } # Same as cat -n from now x /^$/ s/^.*$/1/ G h s/^/ / s/^ *\(......\)\n/\1 /p x s/\n.*$// /^9*$/ s/^/0/ s/.9*$/x&/ h s/^.*x// y/0123456789/1234567890/ x s/x.*$// G s/\n// h  File: sed.info, Node: wc -c, Next: wc -w, Prev: cat -b, Up: Examples Counting Characters =================== This script shows another way to do arithmetic with `sed'. In this case we have to add possibly large numbers, so implementing this by successive increments would not be feasible (and possibly even more complicated to contrive than this script). The approach is to map numbers to letters, kind of an abacus implemented with `sed'. `a's are units, `b's are tenths and so on: we simply add the number of characters on the current line as units, and then propagate the carry to tenths, hundredths, and so on. As usual, running totals are kept in hold space. On the last line, we convert the abacus form back to decimal. For the sake of variety, this is done with a loop rather than with some 80 `s' commands(1): first we convert units, removing `a's from the number; then we rotate letters so that tenths become `a's, and so on until no more letters remain. #!/usr/bin/sed -nf # Add n+1 a's to hold space (+1 is for the newline) s/./a/g H x s/\n/a/ # Do the carry. The t's and b's are not necessary, # but they do speed up the thing t a : a; s/aaaaaaaaaa/b/g; t b; b done : b; s/bbbbbbbbbb/c/g; t c; b done : c; s/cccccccccc/d/g; t d; b done : d; s/dddddddddd/e/g; t e; b done : e; s/eeeeeeeeee/f/g; t f; b done : f; s/ffffffffff/g/g; t g; b done : g; s/gggggggggg/h/g; t h; b done : h; s/hhhhhhhhhh//g : done $! { h b } # On the last line, convert back to decimal : loop /a/! s/[b-h]*/&0/ s/aaaaaaaaa/9/ s/aaaaaaaa/8/ s/aaaaaaa/7/ s/aaaaaa/6/ s/aaaaa/5/ s/aaaa/4/ s/aaa/3/ s/aa/2/ s/a/1/ : next y/bcdefgh/abcdefg/ /[a-h]/ b loop p ---------- Footnotes ---------- (1) Some implementations have a limit of 199 commands per script  File: sed.info, Node: wc -w, Next: wc -l, Prev: wc -c, Up: Examples Counting Words ============== This script is almost the same as the previous one, once each of the words on the line is converted to a single `a' (in the previous script each letter was changed to an `a'). It is interesting that real `wc' programs have optimized loops for `wc -c', so they are much slower at counting words rather than characters. This script's bottleneck, instead, is arithmetic, and hence the word-counting one is faster (it has to manage smaller numbers). Again, the common parts are not commented to show the importance of commenting `sed' scripts. #!/usr/bin/sed -nf # Convert words to a's s/[ tab][ tab]*/ /g s/^/ / s/ [^ ][^ ]*/a /g s/ //g # Append them to hold space H x s/\n// # From here on it is the same as in wc -c. /aaaaaaaaaa/! bx; s/aaaaaaaaaa/b/g /bbbbbbbbbb/! bx; s/bbbbbbbbbb/c/g /cccccccccc/! bx; s/cccccccccc/d/g /dddddddddd/! bx; s/dddddddddd/e/g /eeeeeeeeee/! bx; s/eeeeeeeeee/f/g /ffffffffff/! bx; s/ffffffffff/g/g /gggggggggg/! bx; s/gggggggggg/h/g s/hhhhhhhhhh//g :x $! { h; b; } :y /a/! s/[b-h]*/&0/ s/aaaaaaaaa/9/ s/aaaaaaaa/8/ s/aaaaaaa/7/ s/aaaaaa/6/ s/aaaaa/5/ s/aaaa/4/ s/aaa/3/ s/aa/2/ s/a/1/ y/bcdefgh/abcdefg/ /[a-h]/ by p  File: sed.info, Node: wc -l, Next: head, Prev: wc -w, Up: Examples Counting Lines ============== No strange things are done now, because `sed' gives us `wc -l' functionality for free!!! Look: #!/usr/bin/sed -nf $=  File: sed.info, Node: head, Next: tail, Prev: wc -l, Up: Examples Printing the First Lines ======================== This script is probably the simplest useful `sed' script. It displays the first 10 lines of input; the number of displayed lines is right before the `q' command. #!/usr/bin/sed -f 10q  File: sed.info, Node: tail, Next: uniq, Prev: head, Up: Examples Printing the Last Lines ======================= Printing the last N lines rather than the first is more complex but indeed possible. N is encoded in the second line, before the bang character. This script is similar to the `tac' script in that it keeps the final output in the hold space and prints it at the end: #!/usr/bin/sed -nf 1! {; H; g; } 1,10 !s/[^\n]*\n// $p h Mainly, the scripts keeps a window of 10 lines and slides it by adding a line and deleting the oldest (the substitution command on the second line works like a `D' command but does not restart the loop). The "sliding window" technique is a very powerful way to write efficient and complex `sed' scripts, because commands like `P' would require a lot of work if implemented manually. To introduce the technique, which is fully demonstrated in the rest of this chapter and is based on the `N', `P' and `D' commands, here is an implementation of `tail' using a simple "sliding window." This looks complicated but in fact the working is the same as the last script: after we have kicked in the appropriate number of lines, however, we stop using the hold space to keep inter-line state, and instead use `N' and `D' to slide pattern space by one line: #!/usr/bin/sed -f 1h 2,10 {; H; g; } $q 1,9d N D  File: sed.info, Node: uniq, Next: uniq -d, Prev: tail, Up: Examples Make Duplicate Lines Unique =========================== This is an example of the art of using the `N', `P' and `D' commands, probably the most difficult to master. #!/usr/bin/sed -f h :b # On the last line, print and exit $b N /^\(.*\)\n\1$/ { # The two lines are identical. Undo the effect of # the n command. g bb } # If the `N' command had added the last line, print and exit $b # The lines are different; print the first and go # back working on the second. P D As you can see, we mantain a 2-line window using `P' and `D'. This technique is often used in advanced `sed' scripts.  File: sed.info, Node: uniq -d, Next: uniq -u, Prev: uniq, Up: Examples Print Duplicated Lines of Input =============================== This script prints only duplicated lines, like `uniq -d'. #!/usr/bin/sed -nf $b N /^\(.*\)\n\1$/ { # Print the first of the duplicated lines s/.*\n// p # Loop until we get a different line :b $b N /^\(.*\)\n\1$/ { s/.*\n// bb } } # The last line cannot be followed by duplicates $b # Found a different one. Leave it alone in the pattern space # and go back to the top, hunting its duplicates D  File: sed.info, Node: uniq -u, Next: cat -s, Prev: uniq -d, Up: Examples Remove All Duplicated Lines =========================== This script prints only unique lines, like `uniq -u'. #!/usr/bin/sed -f # Search for a duplicate line --- until that, print what you find. $b N /^\(.*\)\n\1$/ ! { P D } :c # Got two equal lines in pattern space. At the # end of the file we simply exit $d # Else, we keep reading lines with `N' until we # find a different one s/.*\n// N /^\(.*\)\n\1$/ { bc } # Remove the last instance of the duplicate line # and go back to the top D  File: sed.info, Node: cat -s, Prev: uniq -u, Up: Examples Squeezing Blank Lines ===================== As a final example, here are three scripts, of increasing complexity and speed, that implement the same function as `cat -s', that is squeezing blank lines. The first leaves a blank line at the beginning and end if there are some already. #!/usr/bin/sed -f # on empty lines, join with next # Note there is a star in the regexp :x /^\n*$/ { N bx } # now, squeeze all '\n', this can be also done by: # s/^\(\n\)*/\1/ s/\n*/\ / This one is a bit more complex and removes all empty lines at the beginning. It does leave a single blank line at end if one was there. #!/usr/bin/sed -f # delete all leading empty lines 1,/^./{ /./!d } # on an empty line we remove it and all the following # empty lines, but one :x /./!{ N s/^\n$// tx } This removes leading and trailing blank lines. It is also the fastest. Note that loops are completely done with `n' and `b', without exploting the fact that `sed' cycles back to the top of the script automatically at the end of a line. #!/usr/bin/sed -nf # delete all (leading) blanks /./!d # get here: so there is a non empty :x # print it p # get next n # got chars? print it again, etc... /./bx # no, don't have chars: got an empty line :z # get next, if last line we finish here so no trailing # empty lines are written n # also empty? then ignore it, and get next... this will # remove ALL empty lines /./!bz # all empty lines were deleted/ignored, but we have a non empty. As # what we want to do is to squeeze, insert a blank line artificially i\ bx  File: sed.info, Node: Limitations, Next: Other Resources, Prev: Examples, Up: Top `super-sed''s Limitations and Non-limitations ********************************************* For those who want to write portable `sed' scripts, be aware that some implementations have been known to limit line lengths (for the pattern and hold spaces) to be no more than 4000 bytes. The POSIX standard specifies that conforming `sed' implementations shall support at least 8192 byte line lengths. `super-sed' has no built-in limit on line length; as long as it can `malloc()' more (virtual) memory, you can feed or construct lines as long as you like. However, recursion is used to handle subpatterns and indefinite repetition. This means that the available stack space may limit the size of the buffer that can be processed by certain patterns. There are some size limitations in the regular expression matcher but it is hoped that they will never in practice be relevant. The maximum length of a compiled pattern is 65539 (sic) bytes. All values in repeating quantifiers must be less than 65536. The maximum nesting depth of all parenthesized subpatterns, including capturing and non-capturing subpatterns(1), assertions, and other types of subpattern, is 200. Also, `super-sed' recognizes the POSIX syntax `[.CH.]' and `[=CH=]' where CH is a "collating element", but these are not supported, and an error is given if they are encountered. Here are a few distinctions between the real Perl-style regular expressions and those that `-R' recognizes. 1. Lookahead assertions do not allow repeat quantifiers after them Perl permits them, but they do not mean what you might think. For example, `(?!a){3}' does not assert that the next three characters are not `a'. It just asserts three times that the next character is not `a' -- a waste of time and nothing else. 2. Capturing subpatterns that occur inside negative lookahead head assertions are counted, but their entries are counted as empty in the second half of an `s' command. Perl sets its numerical variables from any such patterns that are matched before the assertion fails to match something (thereby succeeding), but only if the negative lookahead assertion contains just one branch. 3. The following Perl escape sequences are not supported: `\l', `\u', `\L', `\U', `\E', `\Q'. In fact these are implemented by Perl's general string-handling and are not part of its pattern matching engine. 4. The Perl `\G' assertion is not supported as it is not relevant to single pattern matches. 5. Fairly obviously, `super-sed' does not support the `(?{code})' and `(?p{code})' constructions. However, there is some experimental support for recursive patterns using the non-Perl item `(?R)'. 6. There are at the time of writing some oddities in Perl 5.005_02 concerned with the settings of captured strings when part of a pattern is repeated. For example, matching `aba' against the pattern `/^(a(b)?)+$/' sets `$2'(2) to the value `b', but matching `aabbaa' against `/^(aa(bb)?)+$/' leaves `$2' unset. However, if the pattern is changed to `/^(aa(b(b))?)+$/' then `$2' (and `$3') are set. In Perl 5.004 `$2' is set in both cases, and that is also true of `super-sed'. 7. Another as yet unresolved discrepancy is that in Perl 5.005_02 the pattern `/^(a)?(?(1)a|b)+$/' matches the string `a', whereas in `super-sed' it does not. However, in both Perl and `super-sed' `/^(a)?a/' matched against `a' leaves $1 unset. ---------- Footnotes ---------- (1) The distinction is meaningful when referring to Perl-style regular expressions. (2) `$2' would be `\2' in `super-sed'.  File: sed.info, Node: Other Resources, Next: Reporting Bugs, Prev: Limitations, Up: Top Other Resources for Learning About `sed' **************************************** In addition to several books that have been written about `sed' (either specifically or as chapters in books which discuss shell programming), one can find out more about `sed' (including suggestions of a few books) from the FAQ for the `sed-users' mailing list, available from any of: `http://www.student.northpark.edu/pemente/sed/sedfaq.html' `http://sed.sf.net/grabbag/tutorials/sedfaq.html' Also of interest are `http://www.student.northpark.edu/pemente/sed/index.htm' and `http://sed.sf.net/grabbag', which include `sed' tutorials and other `sed'-related goodies. The `sed-users' mailing list itself maintained by Sven Guckes. To subscribe, visit `http://groups.yahoo.com' and search for the `sed-users' mailing list.  File: sed.info, Node: Reporting Bugs, Next: Extended regexps, Prev: Other Resources, Up: Top Reporting Bugs ************** Email bug reports to . Be sure to include the word "sed" somewhere in the `Subject:' field. Also, please include the output of `sed --version' in the body of your report if at all possible. Please do not send a bug report like this: while building frobme-1.3.4 $ configure error--> sed: file sedscr line 1: Unknown option to 's' If `super-sed' doesn't configure your favorite package, take a few extra minutes to identify the specific problem and make a stand-alone test case. Unlike other programs such as C compilers, making such test cases for `sed' is quite simple. A stand-alone test case includes all the data necessary to perform the test, and the specific invocation of `sed' that causes the problem. The smaller a stand-alone test case is, the better. A test case should not involve something as far removed from `sed' as "try to configure frobme-1.3.4". Yes, that is in principle enough information to look for the bug, but that is not a very practical prospect. Here are a few commonly reported bugs that are not bugs. `N' command on the last line Most versions of `sed' exit without printing anything when the `N' command is issued on the last line of a file. `super-sed' prints pattern space before exiting unless of course the `-n' command switch has been specified. This choice is by design. For example, the behavior of sed N foo bar would depend on whether foo has an even or an odd number of lines(1). Or, when writing a script to read the next few lines following a pattern match, traditional implementations of `sed' would force you to write something like /foo/{ $!N; $!N; $!N; $!N; $!N; $!N; $!N; $!N; $!N } instead of just /foo/{ N;N;N;N;N;N;N;N;N; } In any case, the simplest workaround is to use `$d;N' in scripts that rely on the traditional behavior, or to set the `POSIXLY_CORRECT' variable to a non-empty value. Regex syntax clashes (problems with backslashes) `sed' uses the POSIX basic regular expression syntax. According to the standard, the meaning of some escape sequences is undefined in this syntax; notable in the case of `sed' are `\|', `\+', `\?', `\`', `\'', `\<', `\>', `\b', `\B', `\w', and `\W'. As in all GNU programs that use POSIX basic regular expressions, `sed' interprets these escape sequences as special characters. So, `x\+' matches one or more occurrences of `x'. `abc\|def' matches either `abc' or `def'. This syntax may cause problems when running scripts written for other `sed's. Some `sed' programs have been written with the assumption that `\|' and `\+' match the literal characters `|' and `+'. Such scripts must be modified by removing the spurious backslashes if they are to be used with modern implementations of `sed', like `super-sed' or GNU `sed'. On the other hand, some scripts use s|abc\|def||g to remove occurrences of _either_ `abc' or `def'. While this worked until `sed' 4.0.x, newer versions interpret this as removing the string `abc|def'. This is again undefined behavior according to POSIX, and this interpretation is arguably more robust: older `sed's, for example, required that the regex matcher parsed `\/' as `/' in the common case of escaping a slash, which is again undefined behavior; the new behavior avoids this, and this is good because the regex matcher is only partially under our control. In addition, this version of `sed' supports several escape characters (some of which are multi-character) to insert non-printable characters in scripts (`\a', `\c', `\d', `\o', `\r', `\t', `\v', `\x'). These can cause similar problems with scripts written for other `sed's. `-i' clobbers read-only files In short, `sed -i' will let you delete the contents of a read-only file, and in general the `-i' option (*note Invocation: Invoking sed.) lets you clobber protected files. This is not a bug, but rather a consequence of how the Unix filesystem works. The permissions on a file say what can happen to the data in that file, while the permissions on a directory say what can happen to the list of files in that directory. `sed -i' will not ever open for writing a file that is already on disk. Rather, it will work on a temporary file that is finally renamed to the original name: if you rename or delete files, you're actually modifying the contents of the directory, so the operation depends on the permissions of the directory, not of the file. For this same reason, `sed' does not let you use `-i' on a writeable file in a read-only directory (but unbelievably nobody reports that as a bug...). `0a' does not work (gives an error) There is no line 0. 0 is a special address that is only used to treat addresses like `0,/RE/' as active when the script starts: if you write `1,/abc/d' and the first line includes the word `abc', then that match would be ignored because address ranges must span at least two lines (barring the end of the file); but what you probably wanted is to delete every line up to the first one including `abc', and this is obtained with `0,/abc/d'. ---------- Footnotes ---------- (1) which is the actual "bug" that prompted the change in behavior  File: sed.info, Node: Extended regexps, Next: Perl regexps, Prev: Reporting Bugs, Up: Top Extended regular expressions **************************** The only difference between basic and extended regular expressions is in the behavior of a few characters: `?', `+', parentheses, and braces (`{}'). While basic regular expressions require these to be escaped if you want them to behave as special characters, when using extended regular expressions you must escape them if you want them _to match a literal character_. Examples: `abc?' becomes `abc\?' when using extended regular expressions. It matches the literal string `abc?'. `c\+' becomes `c+' when using extended regular expressions. It matches one or more `c's. `a\{3,\}' becomes `a{3,}' when using extended regular expressions. It matches three or more `a's. `\(abc\)\{2,3\}' becomes `(abc){2,3}' when using extended regular expressions. It matches either `abcabc' or `abcabcabc'. `\(abc*\)\1' becomes `(abc*)\1' when using extended regular expressions. Backreferences must still be escaped when using extended regular expressions.  File: sed.info, Node: Perl regexps, Next: Concept Index, Prev: Extended regexps, Up: Top Perl-style regular expressions ****************************** _This part is taken from the `pcre.txt' file distributed together with the free PCRE regular expression matcher; it was written by Philip Hazel._ Perl introduced several extensions to regular expressions, some of them incompatible with the syntax of regular expressions accepted by Emacs and other GNU tools (whose matcher was based on the Emacs matcher). `super-sed' implements both kinds of extensions. * Menu: Other extensions can be roughly subdivided in two categories On one hand Perl introduces several more escaped sequences (that is, sequences introduced by a backslash). On the other hand, it specifies that if a question mark follows an open parentheses it should give a special meaning to the parenthesized group. * Backslash:: Introduces special sequences * Circumflex/dollar sign/period:: Behave specially with regard to new lines * Square brackets:: Are a bit different in strange cases * Options setting:: Toggle modifiers in the middle of a regexp * Non-capturing subpatterns:: Are not counted when backreferencing * Repetition:: Allows for non-greedy matching * Backreferences:: Allows for more than 10 back references * Assertions:: Allows for complex look ahead matches * Non-backtracking subpatterns:: Often gives more performance * Conditional subpatterns:: Allows if/then/else branches * Recursive patterns:: For example to match parentheses * Comments:: Because things can get complex...  File: sed.info, Node: Backslash, Next: Circumflex/dollar sign/period, Up: Perl regexps Backslash ========= There are a few difference in the handling of backslashed sequences in Perl mode. First of all, there are no `\o' and `\d' sequences. ASCII values for characters can be specified in octal with a `\XXX' sequence, where XXX is a sequence of up to three octal digits. If the first digit is a zero, the treatment of the sequence is straightforward; just note that if the character that follows the escaped digit is itself an octal digit, you have to supply three octal digits for XXX. For example `\07' is a BEL character rather than a NUL and a literal `7' (this sequence is instead represented by `\0007'). The handling of a backslash followed by a digit other than 0 is complicated. Outside a character class, `sed' reads it and any following digits as a decimal number. If the number is less than 10, or if there have been at least that many previous capturing left parentheses in the expression, the entire sequence is taken as a back reference. A description of how this works is given later, following the discussion of parenthesized subpatterns. Inside a character class, or if the decimal number is greater than 9 and there have not been that many capturing subpatterns, `sed' re-reads up to three octal digits following the backslash, and generates a single byte from the least significant 8 bits of the value. Any subsequent digits stand for themselves. For example: \040 is another way of writing a space \40 is the same, provided there are fewer than 40 previous capturing subpatterns \7 is always a back reference \011 is always a tab \11 might be a back reference, or another way of writing a tab \0113 is a tab followed by the character `3' \113 is the character with octal code 113 (since there can be no more than 99 back references) \377 is a byte consisting entirely of 1 bits (ASCII 255) \81 is either a back reference, or a binary zero followed by the two characters `81' Note that octal values of 100 or greater must not be introduced duced by a leading zero, because no more than three octal digits are ever read. All the sequences that define a single byte value can be used both inside and outside character classes. In addition, inside a character class, the sequence `\b' is interpreted as the backspace character (hex 08). Outside a character class it has a different meaning (see below). In addition, there are four additional escapes specifying generic character classes (like `\w' and `\W' do): `\d' Matches any decimal digit `\D' Matches any character that is not a decimal digit In Perl mode, these character type sequences can appear both inside and outside character classes. Instead, in POSIX mode these sequences (as well as `\w' and `\W') are treated as two literal characters (a backslash and a letter) inside square brackets. Escaped sequences specifying assertions are also different in Perl mode. An assertion specifies a condition that has to be met at a particular point in a match, without consuming any characters from the subject string. The use of subpatterns for more complicated assertions is described below. The backslashed assertions are `\b' Asserts that the point is at a word boundary. A word boundary is a position in the subject string where the current character and the previous character do not both match `\w' or `\W' (i.e. one matches `\w' and the other matches `\W'), or the start or end of the string if the first or last character matches `\w', respectively. `\B' Asserts that the point is not at a word boundary. `\A' Asserts the matcher is at the start of pattern space (independent of multiline mode). `\Z' Asserts the matcher is at the end of pattern space, or at a newline before the end of pattern space (independent of multiline mode) `\z' Asserts the matcher is at the end of pattern space (independent of multiline mode) These assertions may not appear in character classes (but note that `\b' has a different meaning, namely the backspace character, inside a character class). Note that Perl mode does not support directly assertions for the beginning and the end of word; the GNU extensions `\<' and `\>' achieve this purpose in POSIX mode instead. The `\A', `\Z', and `\z' assertions differ from the traditional circumflex and dollar sign (described below) in that they only ever match at the very start and end of the subject string, whatever options are set; in particular `\A' and `\z' are the same as the GNU extensions `\`' and `\'' that are active in POSIX mode.  File: sed.info, Node: Circumflex/dollar sign/period, Next: Square brackets, Prev: Backslash, Up: Perl regexps Circumflex, dollar sign, period =============================== Outside a character class, in the default matching mode, the circumflex character is an assertion which is true only if the current matching point is at the start of the subject string. Inside a character class, the circumflex has an entirely different meaning (see below). The circumflex need not be the first character of the pattern if a number of alternatives are involved, but it should be the first thing in each alternative in which it appears if the pattern is ever to match that branch. If all possible alternatives, start with a circumflex, that is, if the pattern is constrained to match only at the start of the subject, it is said to be an "anchored" pattern. (There are also other constructs structs that can cause a pattern to be anchored.) A dollar sign is an assertion which is true only if the current matching point is at the end of the subject string, or immediately before a newline character that is the last character in the string (by default). A dollar sign need not be the last character of the pattern if a number of alternatives are involved, but it should be the last item in any branch in which it appears. A dollar sign has no special meaning in a character class. The meanings of the circumflex and dollar sign characters are changed if the `M' modifier option is used. When this is the case, they match immediately after and immediately before an internal `\n' character, respectively, in addition to matching at the start and end of the subject string. For example, the pattern `/^abc$/' matches the subject string `def\nabc' in multiline mode, but not otherwise. Consequently, patterns that are anchored in single line mode because all branches start with `^' are not anchored in multiline mode. Note that the sequences `\A', `\Z', and `\z' can be used to match the start and end of the subject in both modes, and if all branches of a pattern start with `\A' is it always anchored, whether the `M' modifier is set or not. Outside a character class, a dot in the pattern matches any one character in the subject, including a non-printing character, but not (by default) newline. If the `S' modifier is used, dots match newlines as well. Actually, the handling of dot is entirely independent of the handling of circumflex and dollar sign, the only relationship being that they both involve newline characters. Dot has no special meaning in a character class.  File: sed.info, Node: Square brackets, Next: Options setting, Prev: Circumflex/dollar sign/period, Up: Perl regexps Square brackets =============== An opening square bracket introduces a character class, terminated by a closing square bracket. A closing square bracket on its own is not special. If a closing square bracket is required as a member of the class, it should be the first data character in the class (after an initial circumflex, if present) or escaped with a backslash. A character class matches a single character in the subject; the character must be in the set of characters defined by the class, unless the first character in the class is a circumflex, in which case the subject character must not be in the set defined by the class. If a circumflex is actually required as a member of the class, ensure it is not the first character, or escape it with a backslash. For example, the character class [aeiou] matches any lower case vowel, while [^aeiou] matches any character that is not a lower case vowel. Note that a circumflex is just a convenient venient notation for specifying the characters which are in the class by enumerating those that are not. It is not an assertion: it still consumes a character from the subject string, and fails if the current pointer is at the end of the string. When caseless matching is set, any letters in a class represent both their upper case and lower case versions, so for example, a caseless `[aeiou]' matches uppercase and lowercase `A's, and a caseless `[^aeiou]' does not match `A', whereas a case-sensitive version would. The newline character is never treated in any special way in character classes, whatever the setting of the `S' and `M' options (modifiers) is. A class such as `[^a]' will always match a newline. The minus (hyphen) character can be used to specify a range of characters in a character class. For example, `[d-m]' matches any letter between d and m, inclusive. If a minus character is required in a class, it must be escaped with a backslash or appear in a position where it cannot be interpreted as indicating a range, typically as the first or last character in the class. It is not possible to have the literal character `]' as the end character of a range. A pattern such as `[W-]46]' is interpreted as a class of two characters (`W' and `-') followed by a literal string `46]', so it would match `W46]' or `-46]'. However, if the `]' is escaped with a backslash it is interpreted as the end of range, so `[W-\]46]' is interpreted as a single class containing a range followed by two separate characters. The octal or hexadecimal representation of `]' can also be used to end a range. Ranges operate in ASCII collating sequence. They can also be used for characters specified numerically, for example `[\000-\037]'. If a range that includes letters is used when caseless matching is set, it matches the letters in either case. For example, a caseless `[W-c]' is equivalent to `[][\^_`wxyzabc]', matched caselessly, and if character tables for the French locale are in use, `[\xc8-\xcb]' matches accented E characters in both cases. Unlike in POSIX mode, the character types `\d', `\D', `\s', `\S', `\w', and `\W' may also appear in a character class, and add the characters that they match to the class. For example, `[\dABCDEF]' matches any hexadecimal digit. A circumflex can conveniently be used with the upper case character types to specify a more restricted set of characters than the matching lower case type. For example, the class `[^\W_]' matches any letter or digit, but not underscore. All non-alphameric characters other than `\', `-', `^' (at the start) and the terminating `]' are non-special in character classes, but it does no harm if they are escaped. Perl 5.6 supports the POSIX notation for character classes, which uses names enclosed by `[:' and `:]' within the enclosing square brackets, and `super-sed' supports this notation as well. For example, [01[:alpha:]%] matches `0', `1', any alphabetic character, or `%'. The supported class names are `alnum' Matches letters and digits `alpha' Matches letters `ascii' Matches character codes 0 - 127 `cntrl' Matches control characters `digit' Matches decimal digits (same as \d) `graph' Matches printing characters, excluding space `lower' Matches lower case letters `print' Matches printing characters, including space `punct' Matches printing characters, excluding letters and digits `space' Matches white space (same as \s) `upper' Matches upper case letters `word' Matches "word" characters (same as \w) `xdigit' Matches hexadecimal digits The names `ascii' and `word' are extensions valid only in Perl mode. Another Perl extension is negation, which is indicated by a circumflex character after the colon. For example, [12[:^digit:]] matches `1', `2', or any non-digit.  File: sed.info, Node: Options setting, Next: Non-capturing subpatterns, Prev: Square brackets, Up: Perl regexps Options setting =============== The settings of the `I', `M', `S', `X' modifiers can be changed from within the pattern by a sequence of Perl option letters enclosed between `(?' and `)'. The option letters must be lowercase. For example, `(?im)' sets caseless, multiline matching. It is also possible to unset these options by preceding the letter with a hyphen; you can also have combined settings and unsettings: `(?im-sx)' sets caseless and multiline matching, while unsets single line matching (for dots) and extended whitespace interpretation. If a letter appears both before and after the hyphen, the option is unset. The scope of these option changes depends on where in the pattern the setting occurs. For settings that are outside any subpattern (defined below), the effect is the same as if the options were set or unset at the start of matching. The following patterns all behave in exactly the same way: (?i)abc a(?i)bc ab(?i)c abc(?i) which in turn is the same as specifying the pattern abc with the `I' modifier. In other words, "top level" settings apply to the whole pattern (unless there are other changes inside subpatterns). If there is more than one setting of the same option at top level, the rightmost setting is used. If an option change occurs inside a subpattern, the effect is different. This is a change of behaviour in Perl 5.005. An option change inside a subpattern affects only that part of the subpattern _that follows_ it, so (a(?i)b)c matches abc and aBc and no other strings (assuming case-sensitive matching is used). By this means, options can be made to have different settings in different parts of the pattern. Any changes made in one alternative do carry on into subsequent branches within the same subpattern. For example, (a(?i)b|c) matches `ab', `aB', `c', and `C', even though when matching `C' the first branch is abandoned before the option setting. This is because the effects of option settings happen at compile time. There would be some very weird behaviour otherwise.  File: sed.info, Node: Non-capturing subpatterns, Next: Repetition, Prev: Options setting, Up: Perl regexps Non-capturing subpatterns ========================= Marking part of a pattern as a subpattern does two things. On one hand, it localizes a set of alternatives; on the other hand, it sets up the subpattern as a capturing subpattern (as defined above). The subpattern can be backreferenced and referenced in the right side of `s' commands. For example, if the string `the red king' is matched against the pattern the ((red|white) (king|queen)) the captured substrings are `red king', `red', and `king', and are numbered 1, 2, and 3. The fact that plain parentheses fulfil two functions is not always helpful. There are often times when a grouping subpattern is required without a capturing requirement. If an opening parenthesis is followed by `?:', the subpattern does not do any capturing, and is not counted when computing the number of any subsequent capturing subpatterns. For example, if the string `the white queen' is matched against the pattern the ((?:red|white) (king|queen)) the captured substrings are `white queen' and `queen', and are numbered 1 and 2. The maximum number of captured substrings is 99, while the maximum number of all subpatterns, both capturing and non-capturing, is 200. As a convenient shorthand, if any option settings are equired at the start of a non-capturing subpattern, the option letters may appear between the `?' and the `:'. Thus the two patterns (?i:saturday|sunday) (?:(?i)saturday|sunday) match exactly the same set of strings. Because alternative branches are tried from left to right, and options are not reset until the end of the subpattern is reached, an option setting in one branch does affect subsequent branches, so the above patterns match `SUNDAY' as well as `Saturday'.  File: sed.info, Node: Repetition, Next: Backreferences, Prev: Non-capturing subpatterns, Up: Perl regexps Repetition ========== Repetition is specified by quantifiers, which can follow any of the following items: * a single character, possibly escaped * the `.' special character * a character class * a back reference (see next section) * a parenthesized subpattern (unless it is an assertion; *note Assertions::) The general repetition quantifier specifies a minimum and maximum number of permitted matches, by giving the two numbers in curly brackets (braces), separated by a comma. The numbers must be less than 65536, and the first must be less than or equal to the second. For example: z{2,4} matches `zz', `zzz', or `zzzz'. A closing brace on its own is not a special character. If the second number is omitted, but the comma is present, there is no upper limit; if the second number and the comma are both omitted, the quantifier specifies an exact number of required matches. Thus [aeiou]{3,} matches at least 3 successive vowels, but may match many more, while \d{8} matches exactly 8 digits. An opening curly bracket that appears in a position where a quantifier is not allowed, or one that does not match the syntax of a quantifier, is taken as a literal character. For example, {,6} is not a quantifier, but a literal string of four characters.(1) The quantifier `{0}' is permitted, causing the expression to behave as if the previous item and the quantifier were not present. For convenience (and historical compatibility) the three most common quantifiers have single-character abbreviations: `*' is equivalent to {0,} `+' is equivalent to {1,} `?' is equivalent to {0,1} It is possible to construct infinite loops by following a subpattern that can match no characters with a quantifier that has no upper limit, for example: (a?)* Earlier versions of Perl used to give an error at compile time for such patterns. However, because there are cases where this can be useful, such patterns are now accepted, but if any repetition of the subpattern does in fact match no characters, the loop is forcibly broken. By default, the quantifiers are "greedy" like in POSIX mode, that is, they match as much as possible (up to the maximum number of permitted times), without causing the rest of the pattern to fail. The classic example of where this gives problems is in trying to match comments in C programs. These appear between the sequences `/*' and `*/' and within the sequence, individual `*' and `/' characters may appear. An attempt to match C comments by applying the pattern /\*.*\*/ to the string /* first command */ not comment /* second comment */ fails, because it matches the entire string owing to the greediness of the `.*' item. However, if a quantifier is followed by a question mark, it ceases to be greedy, and instead matches the minimum number of times possible, so the pattern `/\*.*?\*/' does the right thing with the C comments. The meaning of the various quantifiers is not otherwise changed, just the preferred number of matches. Do not confuse this use of question mark with its use as a quantifier in its own right. Because it has two uses, it can sometimes appear doubled, as in \d??\d which matches one digit by preference, but can match two if that is the only way the rest of the pattern matches. Note that greediness does not matter when specifying addresses, but can be nevertheless used to improve performance. When a parenthesized subpattern is quantified with a minimum repeat count that is greater than 1 or with a limited maximum, more store is required for the compiled pattern, in proportion to the size of the minimum or maximum. If a pattern starts with `.*' or `.{0,}' and the `S' modifier is used, the pattern is implicitly anchored, because whatever follows will be tried against every character position in the subject string, so there is no point in retrying the overall match at any position after the first. PCRE treats such a pattern as though it were preceded by \A. When a capturing subpattern is repeated, the value captured is the substring that matched the final iteration. For example, after (tweedle[dume]{3}\s*)+ has matched `tweedledum tweedledee' the value of the captured substring is `tweedledee'. However, if there are nested capturing subpatterns, the corresponding captured values may have been set in previous iterations. For example, after /(a|(b))+/ matches `aba', the value of the second captured substring is `b'. ---------- Footnotes ---------- (1) It raises an error if `-R' is not used.  File: sed.info, Node: Backreferences, Next: Assertions, Prev: Repetition, Up: Perl regexps Backreferences ============== Outside a character class, a backslash followed by a digit greater than 0 (and possibly further digits) is a back reference to a capturing subpattern earlier (i.e. to its left) in the pattern, provided there have been that many previous capturing left parentheses. However, if the decimal number following the backslash is less than 10, it is always taken as a back reference, and causes an error only if there are not that many capturing left parentheses in the entire pattern. In other words, the parentheses that are referenced need not be to the left of the reference for numbers less than 10. *Note Backslash:: for further details of the handling of digits following a backslash. A back reference matches whatever actually matched the capturing subpattern in the current subject string, rather than anything matching the subpattern itself. So the pattern (sens|respons)e and \1ibility matches `sense and sensibility' and `response and responsibility', but not `sense and responsibility'. If caseful matching is in force at the time of the back reference, the case of letters is relevant. For example, ((?i)blah)\s+\1 matches `blah blah' and `Blah Blah', but not `BLAH blah', even though the original capturing subpattern is matched caselessly. There may be more than one back reference to the same subpattern. Also, if a subpattern has not actually been used in a particular match, any back references to it always fail. For example, the pattern (a|(bc))\2 always fails if it starts to match `a' rather than `bc'. Because there may be up to 99 back references, all digits following the backslash are taken as part of a potential back reference number; this is different from what happens in POSIX mode. If the pattern continues with a digit character, some delimiter must be used to terminate the back reference. If the `X' modifier option is set, this can be whitespace. Otherwise an empty comment can be used, or the following character can be expressed in hexadecimal or octal. A back reference that occurs inside the parentheses to which it refers fails when the subpattern is first used, so, for example, `(a\1)' never matches. However, such references can be useful inside repeated subpatterns. For example, the pattern (a|b\1)+ matches any number of `a's and also `aba', `ababbaa', etc. At each iteration of the subpattern, the back reference matches the character string corresponding to the previous iteration. In order for this to work, the pattern must be such that the first iteration does not need to match the back reference. This can be done using alternation, as in the example above, or by a quantifier with a minimum of zero.  File: sed.info, Node: Assertions, Next: Non-backtracking subpatterns, Prev: Backreferences, Up: Perl regexps Assertions ========== An assertion is a test on the characters following or preceding the current matching point that does not actually consume any characters. The simple assertions coded as `\b', `\B', `\A', `\Z', `\z', `^' and `$' are described above. More complicated assertions are coded as subpatterns. There are two kinds: those that look ahead of the current position in the subject string, and those that look behind it. An assertion subpattern is matched in the normal way, except that it does not cause the current matching position to be changed. Lookahead assertions start with `(?=' for positive assertions and `(?!' for negative assertions. For example, \w+(?=;) matches a word followed by a semicolon, but does not include the semicolon in the match, and foo(?!bar) matches any occurrence of `foo' that is not followed by `bar'. Note that the apparently similar pattern (?!foo)bar finds any occurrence of `bar' even if it is preceded by `foo', because the assertion `(?!foo)' is always true when the next three characters are `bar'. A lookbehind assertion is needed to achieve this effect. Lookbehind assertions start with `(?<=' for positive assertions and `(?' as in this example: (?>\d+)bar This kind of parenthesis "locks up" the part of the pattern it contains once it has matched, and a failure further into the pattern is prevented from backtracking into it. Backtracking past it to previous items, however, works as normal. Non-backtracking subpatterns are not capturing subpatterns. Simple cases such as the above example can be thought of as a maximizing repeat that must swallow everything it can. So, while both `\d+' and `\d+?' are prepared to adjust the number of digits they match in order to make the rest of the pattern match, `(?>\d+)' can only match an entire sequence of digits. This construction can of course contain arbitrarily complicated subpatterns, and it can be nested. Non-backtracking subpatterns can be used in conjunction with look-behind assertions to specify efficient matching at the end of the subject string. Consider a simple pattern such as abcd$ when applied to a long string which does not match. Because matching proceeds from left to right, `sed' will look for each `a' in the subject and then see if what follows matches the rest of the pattern. If the pattern is specified as ^.*abcd$ the initial `.*' matches the entire string at first, but when this fails (because there is no following `a'), it backtracks to match all but the last character, then all but the last two characters, and so on. Once again the search for `a' covers the entire string, from right to left, so we are no better off. However, if the pattern is written as ^(?>.*)(?<=abcd) there can be no backtracking for the .* item; it can match only the entire string. The subsequent lookbehind assertion does a single test on the last four characters. If it fails, the match fails immediately. For long strings, this approach makes a significant difference to the processing time. When a pattern contains an unlimited repeat inside a subpattern that can itself be repeated an unlimited number of times, the use of a once-only subpattern is the only way to avoid some failing matches taking a very long time indeed.(1) The pattern (\D+|<\d+>)*[!?] ([^0-9<]+<(\d+>)?)*[!?] matches an unlimited number of substrings that either consist of non-digits, or digits enclosed in angular brackets, followed by an exclamation or question mark. When it matches, it runs quickly. However, if it is applied to aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa it takes a long time before reporting failure. This is because the string can be divided between the two repeats in a large number of ways, and all have to be tried.(2) If the pattern is changed to ((?>\D+)|<\d+>)*[!?] sequences of non-digits cannot be broken, and failure happens quickly. ---------- Footnotes ---------- (1) Actually, the matcher embedded in `super-sed' tries to do something for this in the simplest cases, like `([^b]*b)*'. These cases are actually quite common: they happen for example in a regular expression like `\/\*([^*]*\*)*\/' which matches C comments. (2) The example used `[!?]' rather than a single character at the end, because both `super-sed' and Perl have an optimization that allows for fast failure when a single character is used. They remember the last single character that is required for a match, and fail early if it is not present in the string.  File: sed.info, Node: Conditional subpatterns, Next: Recursive patterns, Prev: Non-backtracking subpatterns, Up: Perl regexps Conditional subpatterns ======================= It is possible to cause the matching process to obey a subpattern conditionally or to choose between two alternative subpatterns, depending on the result of an assertion, or whether a previous capturing subpattern matched or not. The two possible forms of conditional subpattern are (?(CONDITION)YES-PATTERN) (?(CONDITION)YES-PATTERN|NO-PATTERN) If the condition is satisfied, the yes-pattern is used; otherwise the no-pattern (if present) is used. If there are more than two alternatives in the subpattern, a compile-time error occurs. There are two kinds of condition. If the text between the parentheses consists of a sequence of digits, the condition is satisfied if the capturing subpattern of that number has previously matched. The number must be greater than zero. Consider the following pattern, which contains non-significant white space to make it more readable (assume the `X' modifier) and to divide it into three parts for ease of discussion: ( \( )? [^()]+ (?(1) \) ) The first part matches an optional opening parenthesis, and if that character is present, sets it as the first captured substring. The second part matches one or more characters that are not parentheses. The third part is a conditional subpattern that tests whether the first set of parentheses matched or not. If they did, that is, if subject started with an opening parenthesis, the condition is true, and so the yes-pattern is executed and a closing parenthesis is required. Otherwise, since no-pattern is not present, the subpattern matches nothing. In other words, this pattern matches a sequence of non-parentheses, optionally enclosed in parentheses. If the condition is not a sequence of digits, it must be an assertion. This may be a positive or negative lookahead or lookbehind assertion. Consider this pattern, again containing non-significant white space, and with the two alternatives on the second line: (?(?=...[a-z]) \d\d-[a-z]{3}-\d\d | \d\d-\d\d-\d\d ) The condition is a positive lookahead assertion that matches a letter that is three characters away from the current point. If a letter is found, the subject is matched against the first alternative `DD-AAA-DD' (where AAA are letters and DD are digits); otherwise it is matched against the second alternative, `DD-DD-DD'.  File: sed.info, Node: Recursive patterns, Next: Comments, Prev: Conditional subpatterns, Up: Perl regexps Recursive patterns ================== Consider the problem of matching a string in parentheses, allowing for unlimited nested parentheses. Without the use of recursion, the best that can be done is to use a pattern that matches up to some fixed depth of nesting. It is not possible to handle an arbitrary nesting depth. Perl 5.6 has provided an experimental facility that allows regular expressions to recurse (amongst other things). It does this by interpolating Perl code in the expression at run time, and the code can refer to the expression itself. A Perl pattern tern to solve the parentheses problem can be created like this: $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x; The `(?p{...})' item interpolates Perl code at run time, and in this case refers recursively to the pattern in which it appears. Obviously, `sed' cannot support the interpolation of Perl code. Instead, the special item `(?R)' is provided for the specific case of recursion. This pattern solves the parentheses problem (assume the `X' modifier option is used so that white space is ignored): \( ( (?>[^()]+) | (?R) )* \) First it matches an opening parenthesis. Then it matches any number of substrings which can either be a sequence of non-parentheses, or a recursive match of the pattern itself (i.e. a correctly parenthesized substring). Finally there is a closing parenthesis. This particular example pattern contains nested unlimited repeats, and so the use of a non-backtracking subpattern for matching strings of non-parentheses is important when applying the pattern to strings that do not match. For example, when it is applied to (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() it yields a "no match" response quickly. However, if a standard backtracking subpattern is not used, the match runs for a very long time indeed because there are so many different ways the `+' and `*' repeats can carve up the subject, and all have to be tested before failure can be reported. The values set for any capturing subpatterns are those from the outermost level of the recursion at which the subpattern value is set. If the pattern above is matched against (ab(cd)ef) the value for the capturing parentheses is `ef', which is the last value taken on at the top level.  File: sed.info, Node: Comments, Prev: Recursive patterns, Up: Perl regexps Comments ======== The sequence (?# marks the start of a comment which continues ues up to the next closing parenthesis. Nested parentheses are not permitted. The characters that make up a comment play no part in the pattern matching at all. If the `X' modifier option is used, an unescaped `#' character outside a character class introduces a comment that continues up to the next newline character in the pattern.  File: sed.info, Node: Concept Index, Next: Command and Option Index, Prev: Perl regexps, Up: Top Concept Index ************* This is a general index of all issues discussed in this manual, with the exception of the `sed' commands and command-line options. * Menu: * Additional reading about sed: Other Resources. * ADDR1,+N: Addresses. * ADDR1,~N: Addresses. * Address, as a regular expression: Addresses. * Address, last line: Addresses. * Address, numeric: Addresses. * Addresses, in sed scripts: Addresses. * Append hold space to pattern space: Other Commands. * Append next input line to pattern space: Other Commands. * Append pattern space to hold space: Other Commands. * Appending text after a line: Other Commands. * Backreferences, in regular expressions: The "s" Command. * Branch to a label, if s/// failed: Extended Commands. * Branch to a label, if s/// succeeded: Programming Commands. * Branch to a label, unconditionally: Programming Commands. * Buffer spaces, pattern and hold: Execution Cycle. * Bugs, reporting: Reporting Bugs. * Case-insensitive matching: The "s" Command. * Caveat -- #n on first line: Common Commands. * Command groups: Common Commands. * Comments, in scripts: Common Commands. * Conditional branch <1>: Extended Commands. * Conditional branch: Programming Commands. * Copy hold space into pattern space: Other Commands. * Copy pattern space into hold space: Other Commands. * Delete first line from pattern space: Other Commands. * Disabling autoprint, from command line: Invoking sed. * empty regular expression: Addresses. * Evaluate Bourne-shell commands: Extended Commands. * Evaluate Bourne-shell commands, after substitution: The "s" Command. * Exchange hold space with pattern space: Other Commands. * Excluding lines: Addresses. * Extended regular expressions, choosing: Invoking sed. * Extended regular expressions, syntax: Extended regexps. * Files to be processed as input: Invoking sed. * Flow of control in scripts: Programming Commands. * Global substitution: The "s" Command. * GNU extensions, 0 address: Addresses. * GNU extensions, 0,ADDR2 addressing: Addresses. * GNU extensions, ADDR1,+N addressing: Addresses. * GNU extensions, ADDR1,~N addressing: Addresses. * GNU extensions, extended regular expressions: Invoking sed. * GNU extensions, g and NUMBER modifier interaction in s command: The "s" Command. * GNU extensions, I modifier <1>: Addresses. * GNU extensions, I modifier: The "s" Command. * GNU extensions, N~M addresses: Addresses. * GNU extensions, special escapes <1>: Escapes. * GNU extensions, special escapes: Reporting Bugs. * GNU extensions, special two-address forms: Addresses. * GNU extensions, to basic regular expressions <1>: Regular Expressions. * GNU extensions, to basic regular expressions <2>: Reporting Bugs. * GNU extensions, to basic regular expressions: Regular Expressions. * GNU extensions, unlimited line length: Limitations. * Goto, in scripts: Programming Commands. * Greedy regular expression matching <1>: Repetition. * Greedy regular expression matching: Regular Expressions. * Grouping commands: Common Commands. * Hold space, appending from pattern space: Other Commands. * Hold space, appending to pattern space: Other Commands. * Hold space, copy into pattern space: Other Commands. * Hold space, copying pattern space into: Other Commands. * Hold space, definition: Execution Cycle. * Hold space, exchange with pattern space: Other Commands. * In-place editing: Reporting Bugs. * In-place editing, activating: Invoking sed. * In-place editing, Perl-style backup file names: Invoking sed. * Inserting text before a line: Other Commands. * Labels, in scripts: Programming Commands. * Last line, selecting: Addresses. * Line length, setting <1>: Other Commands. * Line length, setting: Invoking sed. * Line number, printing: Other Commands. * Line selection: Addresses. * Line, selecting by number: Addresses. * Line, selecting by regular expression match: Addresses. * Line, selecting last: Addresses. * List pattern space: Other Commands. * Mixing g and NUMBER modifiers in the s command: The "s" Command. * Next input line, append to pattern space: Other Commands. * Next input line, replace pattern space with: Common Commands. * Non-bugs, in-place editing: Reporting Bugs. * Non-bugs, N command on the last line: Reporting Bugs. * Non-bugs, regex syntax clashes: Reporting Bugs. * Parenthesized substrings: The "s" Command. * Pattern space, definition: Execution Cycle. * Perl-style regular expressions, asserting subpatterns: Assertions. * Perl-style regular expressions, assertions <1>: Assertions. * Perl-style regular expressions, assertions: Backslash. * Perl-style regular expressions, backreferences <1>: Backreferences. * Perl-style regular expressions, backreferences: Backslash. * Perl-style regular expressions, case-insensitive <1>: Square brackets. * Perl-style regular expressions, case-insensitive <2>: Options setting. * Perl-style regular expressions, case-insensitive <3>: Addresses. * Perl-style regular expressions, case-insensitive: The "s" Command. * Perl-style regular expressions, character classes <1>: Square brackets. * Perl-style regular expressions, character classes: Backslash. * Perl-style regular expressions, choosing: Invoking sed. * Perl-style regular expressions, comments: Comments. * Perl-style regular expressions, conditional subpatterns: Conditional subpatterns. * Perl-style regular expressions, escaped sequences: Backslash. * Perl-style regular expressions, extended <1>: Comments. * Perl-style regular expressions, extended <2>: Options setting. * Perl-style regular expressions, extended <3>: The "s" Command. * Perl-style regular expressions, extended: Addresses. * Perl-style regular expressions, lookahead subpatterns <1>: Conditional subpatterns. * Perl-style regular expressions, lookahead subpatterns: Assertions. * Perl-style regular expressions, lookbehind subpatterns <1>: Assertions. * Perl-style regular expressions, lookbehind subpatterns: Non-backtracking subpatterns. * Perl-style regular expressions, multiline <1>: Options setting. * Perl-style regular expressions, multiline <2>: Circumflex/dollar sign/period. * Perl-style regular expressions, multiline <3>: Square brackets. * Perl-style regular expressions, multiline <4>: Addresses. * Perl-style regular expressions, multiline: The "s" Command. * Perl-style regular expressions, newlines: Circumflex/dollar sign/period. * Perl-style regular expressions, non-backtracking subpatterns: Non-backtracking subpatterns. * Perl-style regular expressions, non-capturing subpatterns: Non-capturing subpatterns. * Perl-style regular expressions, recursion: Recursive patterns. * Perl-style regular expressions, recursive patterns: Recursive patterns. * Perl-style regular expressions, repetitions: Repetition. * Perl-style regular expressions, single line <1>: The "s" Command. * Perl-style regular expressions, single line <2>: Repetition. * Perl-style regular expressions, single line <3>: Options setting. * Perl-style regular expressions, single line <4>: Square brackets. * Perl-style regular expressions, single line <5>: Circumflex/dollar sign/period. * Perl-style regular expressions, single line: Addresses. * Perl-style regular expressions, stingy repetitions: Repetition. * Perl-style regular expressions, syntax: Perl regexps. * Perl-style regular expressions, toggling options: Options setting. * Portability, comments: Common Commands. * Portability, line length limitations: Limitations. * Portability, N command on the last line: Reporting Bugs. * POSIXLY_CORRECT behavior, bracket expressions: Regular Expressions. * POSIXLY_CORRECT behavior, enabling: Invoking sed. * POSIXLY_CORRECT behavior, escapes: Escapes. * POSIXLY_CORRECT behavior, N command: Reporting Bugs. * Print first line from pattern space: Other Commands. * Printing line number: Other Commands. * Printing text unambiguously: Other Commands. * Quitting <1>: Extended Commands. * Quitting: Common Commands. * Range of lines: Addresses. * Range with start address of zero: Addresses. * Read next input line: Common Commands. * Read text from a file <1>: Extended Commands. * Read text from a file: Other Commands. * Reformat pattern space: Extended Commands. * Reformatting paragraphs: Extended Commands. * Replace hold space with copy of pattern space: Other Commands. * Replace pattern space with copy of hold space: Other Commands. * Replacing all text matching regexp in a line: The "s" Command. * Replacing only Nth match of regexp in a line: The "s" Command. * Replacing selected lines with other text: Other Commands. * Requiring super-sed: Extended Commands. * Script structure: sed Programs. * Script, from a file: Invoking sed. * Script, from command line: Invoking sed. * sed program structure: sed Programs. * Selecting lines to process: Addresses. * Selecting non-matching lines: Addresses. * Several lines, selecting: Addresses. * Slash character, in regular expressions: Addresses. * Spaces, pattern and hold: Execution Cycle. * Special addressing forms: Addresses. * ssed extensions, /dev/stderr file <1>: Other Commands. * ssed extensions, /dev/stderr file: The "s" Command. * ssed extensions, /dev/stdin file <1>: Other Commands. * ssed extensions, /dev/stdin file: Extended Commands. * ssed extensions, /dev/stdout file <1>: Invoking sed. * ssed extensions, /dev/stdout file <2>: Other Commands. * ssed extensions, /dev/stdout file: The "s" Command. * ssed extensions, branch if s/// failed: Extended Commands. * ssed extensions, case modifiers in s commands: The "s" Command. * ssed extensions, checking for their presence: Extended Commands. * ssed extensions, disabling: Invoking sed. * ssed extensions, evaluating Bourne-shell commands <1>: The "s" Command. * ssed extensions, evaluating Bourne-shell commands: Extended Commands. * ssed extensions, in-place editing <1>: Reporting Bugs. * ssed extensions, in-place editing: Invoking sed. * ssed extensions, L command: Extended Commands. * ssed extensions, M modifier <1>: Addresses. * ssed extensions, M modifier: The "s" Command. * ssed extensions, modifiers and the empty regular expression: Addresses. * ssed extensions, Perl-style regular expressions: Invoking sed. * ssed extensions, quitting silently: Extended Commands. * ssed extensions, R command: Extended Commands. * ssed extensions, reading a file a line at a time: Extended Commands. * ssed extensions, reformatting paragraphs: Extended Commands. * ssed extensions, returning an exit code <1>: Extended Commands. * ssed extensions, returning an exit code: Common Commands. * ssed extensions, S modifier <1>: The "s" Command. * ssed extensions, S modifier: Addresses. * ssed extensions, setting line length: Other Commands. * ssed extensions, subprocesses <1>: Extended Commands. * ssed extensions, subprocesses: The "s" Command. * ssed extensions, two addresses supported by most commands: Other Commands. * ssed extensions, writing first line to a file: Extended Commands. * ssed extensions, X modifier <1>: The "s" Command. * ssed extensions, X modifier: Addresses. * Standard input, processing as input: Invoking sed. * Stream editor: Introduction. * Subprocesses <1>: Extended Commands. * Subprocesses: The "s" Command. * Substitution of text, options: The "s" Command. * Text, appending: Other Commands. * Text, deleting: Common Commands. * Text, insertion: Other Commands. * Text, printing: Common Commands. * Text, printing after substitution: The "s" Command. * Text, writing to a file after substitution: The "s" Command. * Transliteration: Other Commands. * Unbuffered I/O, choosing: Invoking sed. * Usage summary, printing: Invoking sed. * Version, printing: Invoking sed. * Working on separate files: Invoking sed. * Write first line to a file: Extended Commands. * Write to a file: Other Commands. * Zero, as range start address: Addresses.  File: sed.info, Node: Command and Option Index, Prev: Concept Index, Up: Top Command and Option Index ************************ This is an alphabetical list of all `sed' commands and command-line options. * Menu: * # (comments): Common Commands. * --expression: Invoking sed. * --file: Invoking sed. * --help: Invoking sed. * --in-place: Invoking sed. * --line-length: Invoking sed. * --quiet: Invoking sed. * --regexp-extended: Invoking sed. * --regexp-perl: Invoking sed. * --silent: Invoking sed. * --unbuffered: Invoking sed. * --version: Invoking sed. * -e: Invoking sed. * -f: Invoking sed. * -i: Invoking sed. * -l: Invoking sed. * -n: Invoking sed. * -n, forcing from within a script: Common Commands. * -R: Invoking sed. * -r: Invoking sed. * -u: Invoking sed. * : (label) command: Programming Commands. * = (print line number) command: Other Commands. * a (append text lines) command: Other Commands. * b (branch) command: Programming Commands. * c (change to text lines) command: Other Commands. * D (delete first line) command: Other Commands. * d (delete) command: Common Commands. * e (evaluate) command: Extended Commands. * G (appending Get) command: Other Commands. * g (get) command: Other Commands. * H (append Hold) command: Other Commands. * h (hold) command: Other Commands. * i (insert text lines) command: Other Commands. * L (fLow paragraphs) command: Extended Commands. * l (list unambiguously) command: Other Commands. * N (append Next line) command: Other Commands. * n (next-line) command: Common Commands. * P (print first line) command: Other Commands. * p (print) command: Common Commands. * q (quit) command: Common Commands. * Q (silent Quit) command: Extended Commands. * r (read file) command: Other Commands. * R (read line) command: Extended Commands. * s command, option flags: The "s" Command. * T (test and branch if failed) command: Extended Commands. * t (test and branch if successful) command: Programming Commands. * v (version) command: Extended Commands. * w (write file) command: Other Commands. * W (write first line) command: Extended Commands. * x (eXchange) command: Other Commands. * y (transliterate) command: Other Commands. * {} command grouping: Common Commands.  Tag Table: Node: Top938 Node: Introduction4812 Node: Invoking sed5362 Ref: Invoking sed-Footnote-110682 Ref: Invoking sed-Footnote-210874 Node: sed Programs10979 Node: Execution Cycle12125 Ref: Execution Cycle-Footnote-113295 Node: Addresses13606 Node: Regular Expressions19063 Node: Common Commands26609 Node: The "s" Command28606 Ref: The "s" Command-Footnote-133634 Node: Other Commands33706 Ref: Other Commands-Footnote-138846 Node: Programming Commands38918 Node: Extended Commands39824 Node: Escapes43409 Ref: Escapes-Footnote-146849 Node: Examples47040 Node: Centering lines48132 Node: Increment a number49041 Ref: Increment a number-Footnote-150618 Node: Rename files to lower case50738 Node: Print bash environment53527 Node: Reverse chars of lines54304 Ref: Reverse chars of lines-Footnote-155317 Node: tac55539 Node: cat -n56334 Node: cat -b58188 Node: wc -c58937 Ref: wc -c-Footnote-160875 Node: wc -w60944 Node: wc -l62413 Node: head62647 Node: tail62968 Node: uniq64404 Node: uniq -d65197 Node: uniq -u65918 Node: cat -s66639 Node: Limitations68549 Ref: Limitations-Footnote-172217 Ref: Limitations-Footnote-272305 Node: Other Resources72348 Node: Reporting Bugs73271 Ref: Reporting Bugs-Footnote-178827 Node: Extended regexps78898 Node: Perl regexps80061 Node: Backslash81810 Node: Circumflex/dollar sign/period86673 Node: Square brackets89274 Node: Options setting94272 Node: Non-capturing subpatterns96506 Node: Repetition98409 Ref: Repetition-Footnote-1103152 Node: Backreferences103200 Node: Assertions106049 Node: Non-backtracking subpatterns110392 Ref: Non-backtracking subpatterns-Footnote-1114465 Ref: Non-backtracking subpatterns-Footnote-2114745 Node: Conditional subpatterns115058 Node: Recursive patterns117616 Node: Comments120053 Node: Concept Index120555 Node: Command and Option Index133929  End Tag Table sed-3.62/doc/sed.texi0000644000076600007660000042005310163556516011403 00000000000000\input texinfo @c -*-texinfo-*- @c Do not edit this file!! It is automatically generated from sed-in.texi. @c @c -- Stuff that needs adding: ---------------------------------------------- @c (document the `;' command-separator) @c -------------------------------------------------------------------------- @c Check for consistency: regexps in @code, text that they match in @samp. @c @c Tips: @c @command for command @c @samp for command fragments: @samp{cat -s} @c @code for sed commands and flags @c Use ``quote'' not `quote' or "quote". @c @c %**start of header @setfilename sed.info @settitle sed, a stream editor @c %**end of header @c @smallbook @include version.texi @c Combine indices. @syncodeindex ky cp @syncodeindex pg cp @syncodeindex tp cp @defcodeindex op @syncodeindex op fn @include config.texi @copying This file documents version @value{VERSION} of @value{SSED}, a stream editor. Copyright @copyright{} 1998, 1999, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This document is released under the terms of the @acronym{GNU} Free Documentation License as published by the Free Software Foundation; either version 1.1, or (at your option) any later version. You should have received a copy of the @acronym{GNU} Free Documentation License along with @value{SSED}; see the file @file{COPYING.DOC}. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. There are no Cover Texts and no Invariant Sections; this text, along with its equivalent in the printed manual, constitutes the Title Page. @end copying @setchapternewpage off @titlepage @title @command{sed}, a stream editor @subtitle version @value{VERSION}, @value{UPDATED} @author by Ken Pizzini, Paolo Bonzini @page @vskip 0pt plus 1filll Copyright @copyright{} 1998, 1999 Free Software Foundation, Inc. @insertcopying Published by the Free Software Foundation, @* 59 Temple Place - Suite 330 @* Boston, MA 02111-1307, USA @end titlepage @node Top @top @ifnottex @insertcopying @end ifnottex @menu * Introduction:: Introduction * Invoking sed:: Invocation * sed Programs:: @command{sed} programs * Examples:: Some sample scripts * Limitations:: Limitations and (non-)limitations of @value{SSED} * Other Resources:: Other resources for learning about @command{sed} * Reporting Bugs:: Reporting bugs * Extended regexps:: @command{egrep}-style regular expressions @ifset PERL * Perl regexps:: Perl-style regular expressions @end ifset * Concept Index:: A menu with all the topics in this manual. * Command and Option Index:: A menu with all @command{sed} commands and command-line options. @detailmenu --- The detailed node listing --- sed Programs: * Execution Cycle:: How @command{sed} works * Addresses:: Selecting lines with @command{sed} * Regular Expressions:: Overview of regular expression syntax * Common Commands:: Often used commands * The "s" Command:: @command{sed}'s Swiss Army Knife * Other Commands:: Less frequently used commands * Programming Commands:: Commands for @command{sed} gurus * Extended Commands:: Commands specific of @value{SSED} * Escapes:: Specifying special characters Examples: * Centering lines:: * Increment a number:: * Rename files to lower case:: * Print bash environment:: * Reverse chars of lines:: * tac:: Reverse lines of files * cat -n:: Numbering lines * cat -b:: Numbering non-blank lines * wc -c:: Counting chars * wc -w:: Counting words * wc -l:: Counting lines * head:: Printing the first lines * tail:: Printing the last lines * uniq:: Make duplicate lines unique * uniq -d:: Print duplicated lines of input * uniq -u:: Remove all duplicated lines * cat -s:: Squeezing blank lines @ifset PERL Perl regexps:: Perl-style regular expressions * Backslash:: Introduces special sequences * Circumflex/dollar sign/period:: Behave specially with regard to new lines * Square brackets:: Are a bit different in strange cases * Options setting:: Toggle modifiers in the middle of a regexp * Non-capturing subpatterns:: Are not counted when backreferencing * Repetition:: Allows for non-greedy matching * Backreferences:: Allows for more than 10 back references * Assertions:: Allows for complex look ahead matches * Non-backtracking subpatterns:: Often gives more performance * Conditional subpatterns:: Allows if/then/else branches * Recursive patterns:: For example to match parentheses * Comments:: Because things can get complex... @end ifset @end detailmenu @end menu @node Introduction @chapter Introduction @cindex Stream editor @command{sed} is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as @command{ed}), @command{sed} works by making only one pass over the input(s), and is consequently more efficient. But it is @command{sed}'s ability to filter text in a pipeline which particularly distinguishes it from other types of editors. @node Invoking sed @chapter Invocation Normally @command{sed} is invoked like this: @example sed SCRIPT INPUTFILE... @end example The full format for invoking @command{sed} is: @example sed OPTIONS... [SCRIPT] [INPUTFILE...] @end example If you do not specify @var{INPUTFILE}, or if @var{INPUTFILE} is @file{-}, @command{sed} filters the contents of the standard input. The @var{script} is actually the first non-option parameter, which @command{sed} specially considers a script and not an input file if (and only if) none of the other @var{options} specifies a script to be executed, that is if neither of the @option{-e} and @option{-f} options is specified. @command{sed} may be invoked with the following command-line options: @table @code @item --version @opindex --version @cindex Version, printing Print out the version of @command{sed} that is being run and a copyright notice, then exit. @item --help @opindex --help @cindex Usage summary, printing Print a usage message briefly summarizing these command-line options and the bug-reporting address, then exit. @item -n @itemx --quiet @itemx --silent @opindex -n @opindex --quiet @opindex --silent @cindex Disabling autoprint, from command line By default, @command{sed} prints out the pattern space at the end of each cycle through the script. These options disable this automatic printing, and @command{sed} only produces output when explicitly told to via the @code{p} command. @item -i[@var{SUFFIX}] @itemx --in-place[=@var{SUFFIX}] @opindex -i @opindex --in-place @cindex In-place editing, activating @cindex @value{SSEDEXT}, in-place editing This option specifies that files are to be edited in-place. @value{SSED} does this by creating a temporary file and sending output to this file rather than to the standard output.@footnote{This applies to commands such as @code{=}, @code{a}, @code{c}, @code{i}, @code{l}, @code{p}. You can still write to the standard output by using the @code{w} @cindex @value{SSEDEXT}, @file{/dev/stdout} file or @code{W} commands together with the @file{/dev/stdout} special file}. This option implies @option{-s}. When the end of the file is reached, the temporary file is renamed to the output file's original name. The extension, if supplied, is used to modify the name of the old file before renaming the temporary file, thereby making a backup copy@footnote{Note that @value{SSED} creates the backup file whether or not any output is actually changed.}). @cindex In-place editing, Perl-style backup file names This rule is followed: if the extension doesn't contain a @code{*}, then it is appended to the end of the current filename as a suffix; if the extension does contain one or more @code{*} characters, then @emph{each} asterisk is replaced with the current filename. This allows you to add a prefix to the backup file, instead of (or in addition to) a suffix, or even to place backup copies of the original files into another directory (provided the directory already exists). If no extension is supplied, the original file is overwritten without making a backup. @item -l @var{N} @itemx --line-length=@var{N} @opindex -l @opindex --line-length @cindex Line length, setting Specify the default line-wrap length for the @code{l} command. A length of 0 (zero) means to never wrap long lines. If not specified, it is taken to be 70. @item --posix @cindex @value{SSEDEXT}, disabling @value{SSED} includes several extensions to @acronym{POSIX} sed. In order to simplify writing portable scripts, this option disables all the extensions that this manual documents, including additional commands. @cindex @code{POSIXLY_CORRECT} behavior, enabling Most of the extensions accept @command{sed} programs that are outside the syntax mandated by @acronym{POSIX}, but some of them (such as the behavior of the @command{N} command described in @pxref{Reporting Bugs}) actually violate the standard. If you want to disable only the latter kind of extension, you can set the @code{POSIXLY_CORRECT} variable to a non-empty value. @item -r @itemx --regexp-extended @opindex -r @opindex --regexp-extended @cindex Extended regular expressions, choosing @cindex @acronym{GNU} extensions, extended regular expressions Use extended regular expressions rather than basic regular expressions. Extended regexps are those that @command{egrep} accepts; they can be clearer because they usually have less backslashes, but are a @acronym{GNU} extension and hence scripts that use them are not portable. @xref{Extended regexps, , Extended regular expressions}. @ifset PERL @item -R @itemx --regexp-perl @opindex -R @opindex --regexp-perl @cindex Perl-style regular expressions, choosing @cindex @value{SSEDEXT}, Perl-style regular expressions Use Perl-style regular expressions rather than basic regular expressions. Perl-style regexps are extremely powerful but are a @value{SSED} extension and hence scripts that use it are not portable. @xref{Perl regexps, , Perl-style regular expressions}. @end ifset @item -s @itemx --separate @cindex Working on separate files By default, @command{sed} will consider the files specified on the command line as a single continuous long stream. This @value{SSED} extension allows the user to consider them as separate files: range addresses (such as @samp{/abc/,/def/}) are not allowed to span several files, line numbers are relative to the start of each file, @code{$} refers to the last line of each file, and files invoked from the @code{R} commands are rewound at the start of each file. @item -u @itemx --unbuffered @opindex -u @opindex --unbuffered @cindex Unbuffered I/O, choosing Buffer both input and output as minimally as practical. (This is particularly useful if the input is coming from the likes of @samp{tail -f}, and you wish to see the transformed output as soon as possible.) @item -e @var{script} @itemx --expression=@var{script} @opindex -e @opindex --expression @cindex Script, from command line Add the commands in @var{script} to the set of commands to be run while processing the input. @item -f @var{script-file} @itemx --file=@var{script-file} @opindex -f @opindex --file @cindex Script, from a file Add the commands contained in the file @var{script-file} to the set of commands to be run while processing the input. @end table If no @option{-e}, @option{-f}, @option{--expression}, or @option{--file} options are given on the command-line, then the first non-option argument on the command line is taken to be the @var{script} to be executed. @cindex Files to be processed as input If any command-line parameters remain after processing the above, these parameters are interpreted as the names of input files to be processed. @cindex Standard input, processing as input A file name of @samp{-} refers to the standard input stream. The standard input will be processed if no file names are specified. @node sed Programs @chapter @command{sed} Programs @cindex @command{sed} program structure @cindex Script structure A @command{sed} program consists of one or more @command{sed} commands, passed in by one or more of the @option{-e}, @option{-f}, @option{--expression}, and @option{--file} options, or the first non-option argument if zero of these options are used. This document will refer to ``the'' @command{sed} script; this is understood to mean the in-order catenation of all of the @var{script}s and @var{script-file}s passed in. Each @code{sed} command consists of an optional address or address range, followed by a one-character command name and any additional command-specific code. @menu * Execution Cycle:: How @command{sed} works * Addresses:: Selecting lines with @command{sed} * Regular Expressions:: Overview of regular expression syntax * Common Commands:: Often used commands * The "s" Command:: @command{sed}'s Swiss Army Knife * Other Commands:: Less frequently used commands * Programming Commands:: Commands for @command{sed} gurus * Extended Commands:: Commands specific of @value{SSED} * Escapes:: Specifying special characters @end menu @node Execution Cycle @section How @command{sed} Works @cindex Buffer spaces, pattern and hold @cindex Spaces, pattern and hold @cindex Pattern space, definition @cindex Hold space, definition @command{sed} maintains two data buffers: the active @emph{pattern} space, and the auxiliary @emph{hold} space. Both are initially empty. @command{sed} operates by performing the following cycle on each lines of input: first, @command{sed} reads one line from the input stream, removes any trailing newline, and places it in the pattern space. Then commands are executed; each command can have an address associated to it: addresses are a kind of condition code, and a command is only executed if the condition is verified before the command is to be executed. When the end of the script is reached, unless the @option{-n} option is in use, the contents of pattern space are printed out to the output stream, adding back the trailing newline if it was removed.@footnote{Actually, if @command{sed} prints a line without the terminating newline, it will nevertheless print the missing newline as soon as more text is sent to the same output stream, which gives the ``least expected surprise'' even though it does not make commands like @samp{sed -n p} exactly identical to @command{cat}.} Then the next cycle starts for the next input line. Unless special commands (like @samp{D}) are used, the pattern space is deleted between two cycles. The hold space, on the other hand, keeps its data between cycles (see commands @samp{h}, @samp{H}, @samp{x}, @samp{g}, @samp{G} to move data between both buffers). @node Addresses @section Selecting lines with @command{sed} @cindex Addresses, in @command{sed} scripts @cindex Line selection @cindex Selecting lines to process Addresses in a @command{sed} script can be in any of the following forms: @table @code @item @var{number} @cindex Address, numeric @cindex Line, selecting by number Specifying a line number will match only that line in the input. (Note that @command{sed} counts lines continuously across all input files unless @option{-i} or @option{-s} options are specified.) @item @var{first}~@var{step} @cindex @acronym{GNU} extensions, @samp{@var{n}~@var{m}} addresses This @acronym{GNU} extension matches every @var{step}th line starting with line @var{first}. In particular, lines will be selected when there exists a non-negative @var{n} such that the current line-number equals @var{first} + (@var{n} * @var{step}). Thus, to select the odd-numbered lines, one would use @code{1~2}; to pick every third line starting with the second, @samp{2~3} would be used; to pick every fifth line starting with the tenth, use @samp{10~5}; and @samp{50~0} is just an obscure way of saying @code{50}. @item $ @cindex Address, last line @cindex Last line, selecting @cindex Line, selecting last This address matches the last line of the last file of input, or the last line of each file when the @option{-i} or @option{-s} options are specified. @item /@var{regexp}/ @cindex Address, as a regular expression @cindex Line, selecting by regular expression match This will select any line which matches the regular expression @var{regexp}. If @var{regexp} itself includes any @code{/} characters, each must be escaped by a backslash (@code{\}). @cindex empty regular expression @cindex @value{SSEDEXT}, modifiers and the empty regular expression The empty regular expression @samp{//} repeats the last regular expression match (the same holds if the empty regular expression is passed to the @code{s} command). Note that modifiers to regular expressions are evaluated when the regular expression is compiled, thus it is invalid to specify them together with the empty regular expression. @item \%@var{regexp}% (The @code{%} may be replaced by any other single character.) @cindex Slash character, in regular expressions This also matches the regular expression @var{regexp}, but allows one to use a different delimiter than @code{/}. This is particularly useful if the @var{regexp} itself contains a lot of slashes, since it avoids the tedious escaping of every @code{/}. If @var{regexp} itself includes any delimiter characters, each must be escaped by a backslash (@code{\}). @item /@var{regexp}/I @itemx \%@var{regexp}%I @cindex @acronym{GNU} extensions, @code{I} modifier @ifset PERL @cindex Perl-style regular expressions, case-insensitive @end ifset The @code{I} modifier to regular-expression matching is a @acronym{GNU} extension which causes the @var{regexp} to be matched in a case-insensitive manner. @item /@var{regexp}/M @itemx \%@var{regexp}%M @ifset PERL @cindex @value{SSEDEXT}, @code{M} modifier @end ifset @cindex Perl-style regular expressions, multiline The @code{M} modifier to regular-expression matching is a @value{SSED} extension which causes @code{^} and @code{$} to match respectively (in addition to the normal behavior) the empty string after a newline, and the empty string before a newline. There are special character sequences @ifset PERL (@code{\A} and @code{\Z} in Perl mode, @code{\`} and @code{\'} in basic or extended regular expression modes) @end ifset @ifclear PERL (@code{\`} and @code{\'}) @end ifclear which always match the beginning or the end of the buffer. @code{M} stands for @cite{multi-line}. @ifset PERL @item /@var{regexp}/S @itemx \%@var{regexp}%S @cindex @value{SSEDEXT}, @code{S} modifier @cindex Perl-style regular expressions, single line The @code{S} modifier to regular-expression matching is only valid in Perl mode and specifies that the dot character (@code{.}) will match the newline character too. @code{S} stands for @cite{single-line}. @end ifset @ifset PERL @item /@var{regexp}/X @itemx \%@var{regexp}%X @cindex @value{SSEDEXT}, @code{X} modifier @cindex Perl-style regular expressions, extended The @code{X} modifier to regular-expression matching is also valid in Perl mode only. If it is used, whitespace in the pattern (other than in a character class) and characters between a @kbd{#} outside a character class and the next newline character are ignored. An escaping backslash can be used to include a whitespace or @kbd{#} character as part of the pattern. @end ifset @end table If no addresses are given, then all lines are matched; if one address is given, then only lines matching that address are matched. @cindex Range of lines @cindex Several lines, selecting An address range can be specified by specifying two addresses separated by a comma (@code{,}). An address range matches lines starting from where the first address matches, and continues until the second address matches (inclusively). If the second address is a @var{regexp}, then checking for the ending match will start with the line @emph{following} the line which matched the first address: a range will always span at least two lines (except of course if the input stream ends). If the second address is a @var{number} less than (or equal to) the line matching the first address, then only the one line is matched. @cindex Special addressing forms @cindex Range with start address of zero @cindex Zero, as range start address @cindex @var{addr1},+N @cindex @var{addr1},~N @cindex @acronym{GNU} extensions, special two-address forms @cindex @acronym{GNU} extensions, @code{0} address @cindex @acronym{GNU} extensions, 0,@var{addr2} addressing @cindex @acronym{GNU} extensions, @var{addr1},+@var{N} addressing @cindex @acronym{GNU} extensions, @var{addr1},~@var{N} addressing @value{SSED} also supports some special two-address forms; all these are @acronym{GNU} extensions: @table @code @item 0,/@var{regexp}/ A line number of @code{0} can be used in an address specification like @code{0,/@var{regexp}/} so that @command{sed} will try to match @var{regexp} in the first input line too. In other words, @code{0,/@var{regexp}/} is similar to @code{1,/@var{regexp}/}, except that if @var{addr2} matches the very first line of input the @code{0,/@var{regexp}/} form will consider it to end the range, whereas the @code{1,/@var{regexp}/} form will match the beginning of its range and hence make the range span up to the @emph{second} occurrence of the regular expression. Note that this is the only place where the @code{0} address makes sense; there is no 0-th line and commands which are given the @code{0} address in any other way will give an error. @item @var{addr1},+@var{N} Matches @var{addr1} and the @var{N} lines following @var{addr1}. @item @var{addr1},~@var{N} Matches @var{addr1} and the lines following @var{addr1} until the next line whose input line number is a multiple of @var{N}. @end table @cindex Excluding lines @cindex Selecting non-matching lines Appending the @code{!} character to the end of an address specification negates the sense of the match. That is, if the @code{!} character follows an address range, then only lines which do @emph{not} match the address range will be selected. This also works for singleton addresses, and, perhaps perversely, for the null address. @node Regular Expressions @section Overview of Regular Expression Syntax To know how to use @command{sed}, people should understand regular expressions (@dfn{regexp} for short). A regular expression is a pattern that is matched against a subject string from left to right. Most characters are @dfn{ordinary}: they stand for themselves in a pattern, and match the corresponding characters in the subject. As a trivial example, the pattern @example The quick brown fox @end example @noindent matches a portion of a subject string that is identical to itself. The power of regular expressions comes from the ability to include alternatives and repetitions in the pattern. These are encoded in the pattern by the use of @dfn{special characters}, which do not stand for themselves but instead are interpreted in some special way. Here is a brief description of regular expression syntax as used in @command{sed}. @table @code @item @var{char} A single ordinary character matches itself. @item * @cindex @acronym{GNU} extensions, to basic regular expressions Matches a sequence of zero or more instances of matches for the preceding regular expression, which must be an ordinary character, a special character preceded by @code{\}, a @code{.}, a grouped regexp (see below), or a bracket expression. As a @acronym{GNU} extension, a postfixed regular expression can also be followed by @code{*}; for example, @code{a**} is equivalent to @code{a*}. @acronym{POSIX} 1003.1-2001 says that @code{*} stands for itself when it appears at the start of a regular expression or subexpression, but many non@acronym{GNU} implementations do not support this and portable scripts should instead use @code{\*} in these contexts. @item \+ @cindex @acronym{GNU} extensions, to basic regular expressions As @code{*}, but matches one or more. It is a @acronym{GNU} extension. @item \? @cindex @acronym{GNU} extensions, to basic regular expressions As @code{*}, but only matches zero or one. It is a @acronym{GNU} extension. @item \@{@var{i}\@} As @code{*}, but matches exactly @var{i} sequences (@var{i} is a decimal integer; for portability, keep it between 0 and 255 inclusive). @item \@{@var{i},@var{j}\@} Matches between @var{i} and @var{j}, inclusive, sequences. @item \@{@var{i},\@} Matches more than or equal to @var{i} sequences. @item \(@var{regexp}\) Groups the inner @var{regexp} as a whole, this is used to: @itemize @bullet @item @cindex @acronym{GNU} extensions, to basic regular expressions Apply postfix operators, like @code{\(abcd\)*}: this will search for zero or more whole sequences of @samp{abcd}, while @code{abcd*} would search for @samp{abc} followed by zero or more occurrences of @samp{d}. Note that support for @code{\(abcd\)*} is required by @acronym{POSIX} 1003.1-2001, but many non-@acronym{GNU} implementations do not support it and hence it is not universally portable. @item Use back references (see below). @end itemize @item . Matches any character, including newline. @item ^ Matches the null string at beginning of line, i.e. what appears after the circumflex must appear at the beginning of line. @code{^#include} will match only lines where @samp{#include} is the first thing on line---if there are spaces before, for example, the match fails. @code{^} acts as a special character only at the beginning of the regular expression or subexpression (that is, after @code{\(} or @code{\|}). Portable scripts should avoid @code{^} at the beginning of a subexpression, though, as @acronym{POSIX} allows implementations that treat @code{^} as an ordinary character in that context. @item $ It is the same as @code{^}, but refers to end of line. @code{$} also acts as a special character only at the end of the regular expression or subexpression (that is, before @code{\)} or @code{\|}), and its use at the end of a subexpression is not portable. @item [@var{list}] @itemx [^@var{list}] Matches any single character in @var{list}: for example, @code{[aeiou]} matches all vowels. A list may include sequences like @code{@var{char1}-@var{char2}}, which matches any character between (inclusive) @var{char1} and @var{char2}. A leading @code{^} reverses the meaning of @var{list}, so that it matches any single character @emph{not} in @var{list}. To include @code{]} in the list, make it the first character (after the @code{^} if needed), to include @code{-} in the list, make it the first or last; to include @code{^} put it after the first character. @cindex @code{POSIXLY_CORRECT} behavior, bracket expressions The characters @code{$}, @code{*}, @code{.}, @code{[}, and @code{\} are normally not special within @var{list}. For example, @code{[\*]} matches either @samp{\} or @samp{*}, because the @code{\} is not special here. However, strings like @code{[.ch.]}, @code{[=a=]}, and @code{[:space:]} are special within @var{list} and represent collating symbols, equivalence classes, and character classes, respectively, and @code{[} is therefore special within @var{list} when it is followed by @code{.}, @code{=}, or @code{:}. Also, when not in @env{POSIXLY_CORRECT} mode, special escapes like @code{\n} and @code{\t} are recognized within @var{list}. @xref{Escapes}. @item @var{regexp1}\|@var{regexp2} @cindex @acronym{GNU} extensions, to basic regular expressions Matches either @var{regexp1} or @var{regexp2}. Use parentheses to use complex alternative regular expressions. The matching process tries each alternative in turn, from left to right, and the first one that succeeds is used. It is a @acronym{GNU} extension. @item @var{regexp1}@var{regexp2} Matches the concatenation of @var{regexp1} and @var{regexp2}. Concatenation binds more tightly than @code{\|}, @code{^}, and @code{$}, but less tightly than the other regular expression operators. @item \@var{digit} Matches the @var{digit}-th @code{\(@dots{}\)} parenthesized subexpression in the regular expression. This is called a @dfn{back reference}. Subexpressions are implicity numbered by counting occurrences of @code{\(} left-to-right. @item \n Matches the newline character. @item \@var{char} Matches @var{char}, where @var{char} is one of @code{$}, @code{*}, @code{.}, @code{[}, @code{\}, or @code{^}. Note that the only C-like backslash sequences that you can portably assume to be interpreted are @code{\n} and @code{\\}; in particular @code{\t} is not portable, and matches a @samp{t} under most implementations of @command{sed}, rather than a tab character. @end table @cindex Greedy regular expression matching Note that the regular expression matcher is greedy, i.e., matches are attempted from left to right and, if two or more matches are possible starting at the same character, it selects the longest. @noindent Examples: @table @samp @item abcdef Matches @samp{abcdef}. @item a*b Matches zero or more @samp{a}s followed by a single @samp{b}. For example, @samp{b} or @samp{aaaaab}. @item a\?b Matches @samp{b} or @samp{ab}. @item a\+b\+ Matches one or more @samp{a}s followed by one or more @samp{b}s: @samp{ab} is the shortest possible match, but other examples are @samp{aaaab} or @samp{abbbbb} or @samp{aaaaaabbbbbbb}. @item .* @itemx .\+ These two both match all the characters in a string; however, the first matches every string (including the empty string), while the second matches only strings containing at least one character. @item ^main.*(.*) his matches a string starting with @samp{main}, followed by an opening and closing parenthesis. The @samp{n}, @samp{(} and @samp{)} need not be adjacent. @item ^# This matches a string beginning with @samp{#}. @item \\$ This matches a string ending with a single backslash. The regexp contains two backslashes for escaping. @item \$ Instead, this matches a string consisting of a single dollar sign, because it is escaped. @item [a-zA-Z0-9] In the C locale, this matches any @acronym{ASCII} letters or digits. @item [^ @kbd{tab}]\+ (Here @kbd{tab} stands for a single tab character.) This matches a string of one or more characters, none of which is a space or a tab. Usually this means a word. @item ^\(.*\)\n\1$ This matches a string consisting of two equal substrings separated by a newline. @item .\@{9\@}A$ This matches nine characters followed by an @samp{A}. @item ^.\@{15\@}A This matches the start of a string that contains 16 characters, the last of which is an @samp{A}. @end table @node Common Commands @section Often-Used Commands If you use @command{sed} at all, you will quite likely want to know these commands. @table @code @item # [No addresses allowed.] @findex # (comments) @cindex Comments, in scripts The @code{#} character begins a comment; the comment continues until the next newline. @cindex Portability, comments If you are concerned about portability, be aware that some implementations of @command{sed} (which are not @sc{posix} conformant) may only support a single one-line comment, and then only when the very first character of the script is a @code{#}. @findex -n, forcing from within a script @cindex Caveat --- #n on first line Warning: if the first two characters of the @command{sed} script are @code{#n}, then the @option{-n} (no-autoprint) option is forced. If you want to put a comment in the first line of your script and that comment begins with the letter @samp{n} and you do not want this behavior, then be sure to either use a capital @samp{N}, or place at least one space before the @samp{n}. @item q [@var{exit-code}] This command only accepts a single address. @findex q (quit) command @cindex @value{SSEDEXT}, returning an exit code @cindex Quitting Exit @command{sed} without processing any more commands or input. Note that the current pattern space is printed if auto-print is not disabled with the @option{-n} options. The ability to return an exit code from the @command{sed} script is a @value{SSED} extension. @item d @findex d (delete) command @cindex Text, deleting Delete the pattern space; immediately start next cycle. @item p @findex p (print) command @cindex Text, printing Print out the pattern space (to the standard output). This command is usually only used in conjunction with the @option{-n} command-line option. @item n @findex n (next-line) command @cindex Next input line, replace pattern space with @cindex Read next input line If auto-print is not disabled, print the pattern space, then, regardless, replace the pattern space with the next line of input. If there is no more input then @command{sed} exits without processing any more commands. @item @{ @var{commands} @} @findex @{@} command grouping @cindex Grouping commands @cindex Command groups A group of commands may be enclosed between @code{@{} and @code{@}} characters. This is particularly useful when you want a group of commands to be triggered by a single address (or address-range) match. @end table @node The "s" Command @section The @code{s} Command The syntax of the @code{s} (as in substitute) command is @samp{s/@var{regexp}/@var{replacement}/@var{flags}}. The @code{/} characters may be uniformly replaced by any other single character within any given @code{s} command. The @code{/} character (or whatever other character is used in its stead) can appear in the @var{regexp} or @var{replacement} only if it is preceded by a @code{\} character. The @code{s} command is probably the most important in @command{sed} and has a lot of different options. Its basic concept is simple: the @code{s} command attempts to match the pattern space against the supplied @var{regexp}; if the match is successful, then that portion of the pattern space which was matched is replaced with @var{replacement}. @cindex Backreferences, in regular expressions @cindex Parenthesized substrings The @var{replacement} can contain @code{\@var{n}} (@var{n} being a number from 1 to 9, inclusive) references, which refer to the portion of the match which is contained between the @var{n}th @code{\(} and its matching @code{\)}. Also, the @var{replacement} can contain unescaped @code{&} characters which reference the whole matched portion of the pattern space. @cindex @value{SSEDEXT}, case modifiers in @code{s} commands Finally, as a @value{SSED} extension, you can include a special sequence made of a backslash and one of the letters @code{L}, @code{l}, @code{U}, @code{u}, or @code{E}. The meaning is as follows: @table @code @item \L Turn the replacement to lowercase until a @code{\U} or @code{\E} is found, @item \l Turn the next character to lowercase, @item \U Turn the replacement to uppercase until a @code{\L} or @code{\E} is found, @item \u Turn the next character to uppercase, @item \E Stop case conversion started by @code{\L} or @code{\U}. @end table To include a literal @code{\}, @code{&}, or newline in the final replacement, be sure to precede the desired @code{\}, @code{&}, or newline in the @var{replacement} with a @code{\}. @findex s command, option flags @cindex Substitution of text, options The @code{s} command can be followed by zero or more of the following @var{flags}: @table @code @item g @cindex Global substitution @cindex Replacing all text matching regexp in a line Apply the replacement to @emph{all} matches to the @var{regexp}, not just the first. @item @var{number} @cindex Replacing only @var{n}th match of regexp in a line Only replace the @var{number}th match of the @var{regexp}. @cindex @acronym{GNU} extensions, @code{g} and @var{number} modifier interaction in @code{s} command @cindex Mixing @code{g} and @var{number} modifiers in the @code{s} command Note: the @sc{posix} standard does not specify what should happen when you mix the @code{g} and @var{number} modifiers, and currently there is no widely agreed upon meaning across @command{sed} implementations. For @value{SSED}, the interaction is defined to be: ignore matches before the @var{number}th, and then match and replace all matches from the @var{number}th on. @item p @cindex Text, printing after substitution If the substitution was made, then print the new pattern space. Note: when both the @code{p} and @code{e} options are specified, the relative ordering of the two produces very different results. In general, @code{ep} (evaluate then print) is what you want, but operating the other way round can be useful for debugging. For this reason, the current version of @value{SSED} interprets specially the presence of @code{p} options both before and after @code{e}, printing the pattern space before and after evaluation, while in general flags for the @code{s} command show their effect just once. This behavior, although documented, might change in future versions. @item w @var{file-name} @cindex Text, writing to a file after substitution @cindex @value{SSEDEXT}, @file{/dev/stdout} file @cindex @value{SSEDEXT}, @file{/dev/stderr} file If the substitution was made, then write out the result to the named file. As a @value{SSED} extension, two special values of @var{file-name} are supported: @file{/dev/stderr}, which writes the result to the standard error, and @file{/dev/stdout}, which writes to the standard output.@footnote{This is equivalent to @code{p} unless the @option{-i} option is being used.} @item e @cindex Evaluate Bourne-shell commands, after substitution @cindex Subprocesses @cindex @value{SSEDEXT}, evaluating Bourne-shell commands @cindex @value{SSEDEXT}, subprocesses This command allows one to pipe input from a shell command into pattern space. If a substitution was made, the command that is found in pattern space is executed and pattern space is replaced with its output. A trailing newline is suppressed; results are undefined if the command to be executed contains a @sc{nul} character. This is a @value{SSED} extension. @item I @itemx i @cindex @acronym{GNU} extensions, @code{I} modifier @cindex Case-insensitive matching @ifset PERL @cindex Perl-style regular expressions, case-insensitive @end ifset The @code{I} modifier to regular-expression matching is a @acronym{GNU} extension which makes @command{sed} match @var{regexp} in a case-insensitive manner. @item M @itemx m @cindex @value{SSEDEXT}, @code{M} modifier @ifset PERL @cindex Perl-style regular expressions, multiline @end ifset The @code{M} modifier to regular-expression matching is a @value{SSED} extension which causes @code{^} and @code{$} to match respectively (in addition to the normal behavior) the empty string after a newline, and the empty string before a newline. There are special character sequences @ifset PERL (@code{\A} and @code{\Z} in Perl mode, @code{\`} and @code{\'} in basic or extended regular expression modes) @end ifset @ifclear PERL (@code{\`} and @code{\'}) @end ifclear which always match the beginning or the end of the buffer. @code{M} stands for @cite{multi-line}. @ifset PERL @item S @itemx s @cindex @value{SSEDEXT}, @code{S} modifier @cindex Perl-style regular expressions, single line The @code{S} modifier to regular-expression matching is only valid in Perl mode and specifies that the dot character (@code{.}) will match the newline character too. @code{S} stands for @cite{single-line}. @end ifset @ifset PERL @item X @itemx x @cindex @value{SSEDEXT}, @code{X} modifier @cindex Perl-style regular expressions, extended The @code{X} modifier to regular-expression matching is also valid in Perl mode only. If it is used, whitespace in the pattern (other than in a character class) and characters between a @kbd{#} outside a character class and the next newline character are ignored. An escaping backslash can be used to include a whitespace or @kbd{#} character as part of the pattern. @end ifset @end table @node Other Commands @section Less Frequently-Used Commands Though perhaps less frequently used than those in the previous section, some very small yet useful @command{sed} scripts can be built with these commands. @table @code @item y/@var{source-chars}/@var{dest-chars}/ (The @code{/} characters may be uniformly replaced by any other single character within any given @code{y} command.) @findex y (transliterate) command @cindex Transliteration Transliterate any characters in the pattern space which match any of the @var{source-chars} with the corresponding character in @var{dest-chars}. Instances of the @code{/} (or whatever other character is used in its stead), @code{\}, or newlines can appear in the @var{source-chars} or @var{dest-chars} lists, provide that each instance is escaped by a @code{\}. The @var{source-chars} and @var{dest-chars} lists @emph{must} contain the same number of characters (after de-escaping). @item a\ @itemx @var{text} @cindex @value{SSEDEXT}, two addresses supported by most commands As a @acronym{GNU} extension, this command accepts two addresses. @findex a (append text lines) command @cindex Appending text after a line @cindex Text, appending Queue the lines of text which follow this command (each but the last ending with a @code{\}, which are removed from the output) to be output at the end of the current cycle, or when the next input line is read. Escape sequences in @var{text} are processed, so you should use @code{\\} in @var{text} to print a single backslash. As a @acronym{GNU} extension, if between the @code{a} and the newline there is other than a whitespace-@code{\} sequence, then the text of this line, starting at the first non-whitespace character after the @code{a}, is taken as the first line of the @var{text} block. (This enables a simplification in scripting a one-line add.) This extension also works with the @code{i} and @code{c} commands. @item i\ @itemx @var{text} @cindex @value{SSEDEXT}, two addresses supported by most commands As a @acronym{GNU} extension, this command accepts two addresses. @findex i (insert text lines) command @cindex Inserting text before a line @cindex Text, insertion Immediately output the lines of text which follow this command (each but the last ending with a @code{\}, which are removed from the output). @item c\ @itemx @var{text} @findex c (change to text lines) command @cindex Replacing selected lines with other text Delete the lines matching the address or address-range, and output the lines of text which follow this command (each but the last ending with a @code{\}, which are removed from the output) in place of the last line (or in place of each line, if no addresses were specified). A new cycle is started after this command is done, since the pattern space will have been deleted. @item = @cindex @value{SSEDEXT}, two addresses supported by most commands As a @acronym{GNU} extension, this command accepts two addresses. @findex = (print line number) command @cindex Printing line number @cindex Line number, printing Print out the current input line number (with a trailing newline). @item l @var{n} @findex l (list unambiguously) command @cindex List pattern space @cindex Printing text unambiguously @cindex Line length, setting @cindex @value{SSEDEXT}, setting line length Print the pattern space in an unambiguous form: non-printable characters (and the @code{\} character) are printed in C-style escaped form; long lines are split, with a trailing @code{\} character to indicate the split; the end of each line is marked with a @code{$}. @var{n} specifies the desired line-wrap length; a length of 0 (zero) means to never wrap long lines. If omitted, the default as specified on the command line is used. The @var{n} parameter is a @value{SSED} extension. @item r @var{filename} @cindex @value{SSEDEXT}, two addresses supported by most commands As a @acronym{GNU} extension, this command accepts two addresses. @findex r (read file) command @cindex Read text from a file @cindex @value{SSEDEXT}, @file{/dev/stdin} file Queue the contents of @var{filename} to be read and inserted into the output stream at the end of the current cycle, or when the next input line is read. Note that if @var{filename} cannot be read, it is treated as if it were an empty file, without any error indication. As a @value{SSED} extension, the special value @file{/dev/stdin} is supported for the file name, which reads the contents of the standard input. @item w @var{filename} @findex w (write file) command @cindex Write to a file @cindex @value{SSEDEXT}, @file{/dev/stdout} file @cindex @value{SSEDEXT}, @file{/dev/stderr} file Write the pattern space to @var{filename}. As a @value{SSED} extension, two special values of @var{file-name} are supported: @file{/dev/stderr}, which writes the result to the standard error, and @file{/dev/stdout}, which writes to the standard output.@footnote{This is equivalent to @code{p} unless the @option{-i} option is being used.} The file will be created (or truncated) before the first input line is read; all @code{w} commands (including instances of @code{w} flag on successful @code{s} commands) which refer to the same @var{filename} are output without closing and reopening the file. @item D @findex D (delete first line) command @cindex Delete first line from pattern space Delete text in the pattern space up to the first newline. If any text is left, restart cycle with the resultant pattern space (without reading a new line of input), otherwise start a normal new cycle. @item N @findex N (append Next line) command @cindex Next input line, append to pattern space @cindex Append next input line to pattern space Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then @command{sed} exits without processing any more commands. @item P @findex P (print first line) command @cindex Print first line from pattern space Print out the portion of the pattern space up to the first newline. @item h @findex h (hold) command @cindex Copy pattern space into hold space @cindex Replace hold space with copy of pattern space @cindex Hold space, copying pattern space into Replace the contents of the hold space with the contents of the pattern space. @item H @findex H (append Hold) command @cindex Append pattern space to hold space @cindex Hold space, appending from pattern space Append a newline to the contents of the hold space, and then append the contents of the pattern space to that of the hold space. @item g @findex g (get) command @cindex Copy hold space into pattern space @cindex Replace pattern space with copy of hold space @cindex Hold space, copy into pattern space Replace the contents of the pattern space with the contents of the hold space. @item G @findex G (appending Get) command @cindex Append hold space to pattern space @cindex Hold space, appending to pattern space Append a newline to the contents of the pattern space, and then append the contents of the hold space to that of the pattern space. @item x @findex x (eXchange) command @cindex Exchange hold space with pattern space @cindex Hold space, exchange with pattern space Exchange the contents of the hold and pattern spaces. @end table @node Programming Commands @section Commands for @command{sed} gurus In most cases, use of these commands indicates that you are probably better off programming in something like @command{awk} or Perl. But occasionally one is committed to sticking with @command{sed}, and these commands can enable one to write quite convoluted scripts. @cindex Flow of control in scripts @table @code @item : @var{label} [No addresses allowed.] @findex : (label) command @cindex Labels, in scripts Specify the location of @var{label} for branch commands. In all other respects, a no-op. @item b @var{label} @findex b (branch) command @cindex Branch to a label, unconditionally @cindex Goto, in scripts Unconditionally branch to @var{label}. The @var{label} may be omitted, in which case the next cycle is started. @item t @var{label} @findex t (test and branch if successful) command @cindex Branch to a label, if @code{s///} succeeded @cindex Conditional branch Branch to @var{label} only if there has been a successful @code{s}ubstitution since the last input line was read or conditional branch was taken. The @var{label} may be omitted, in which case the next cycle is started. @end table @node Extended Commands @section Commands Specific to @value{SSED} These commands are specific to @value{SSED}, so you must use them with care and only when you are sure that hindering portability is not evil. They allow you to check for @value{SSED} extensions or to do tasks that are required quite often, yet are unsupported by standard @command{sed}s. @table @code @item e [@var{command}] @findex e (evaluate) command @cindex Evaluate Bourne-shell commands @cindex Subprocesses @cindex @value{SSEDEXT}, evaluating Bourne-shell commands @cindex @value{SSEDEXT}, subprocesses This command allows one to pipe input from a shell command into pattern space. Without parameters, the @code{e} command executes the command that is found in pattern space and replaces the pattern space with the output; a trailing newline is suppressed. If a parameter is specified, instead, the @code{e} command interprets it as a command and sends its output to the output stream (like @code{r} does). The command can run across multiple lines, all but the last ending with a back-slash. In both cases, the results are undefined if the command to be executed contains a @sc{nul} character. @item L @var{n} @findex L (fLow paragraphs) command @cindex Reformat pattern space @cindex Reformatting paragraphs @cindex @value{SSEDEXT}, reformatting paragraphs @cindex @value{SSEDEXT}, @code{L} command This @value{SSED} extension fills and joins lines in pattern space to produce output lines of (at most) @var{n} characters, like @code{fmt} does; if @var{n} is omitted, the default as specified on the command line is used. This command is considered a failed experiment and unless there is enough request (which seems unlikely) will be removed in future versions. @ignore Blank lines, spaces between words, and indentation are preserved in the output; successive input lines with different indentation are not joined; tabs are expanded to 8 columns. If the pattern space contains multiple lines, they are joined, but since the pattern space usually contains a single line, the behavior of a simple @code{L;d} script is the same as @samp{fmt -s} (i.e., it does not join short lines to form longer ones). @var{n} specifies the desired line-wrap length; if omitted, the default as specified on the command line is used. @end ignore @item Q [@var{exit-code}] This command only accepts a single address. @findex Q (silent Quit) command @cindex @value{SSEDEXT}, quitting silently @cindex @value{SSEDEXT}, returning an exit code @cindex Quitting This command is the same as @code{q}, but will not print the contents of pattern space. Like @code{q}, it provides the ability to return an exit code to the caller. This command can be useful because the only alternative ways to accomplish this apparently trivial function are to use the @option{-n} option (which can unnecessarily complicate your script) or resorting to the following snippet, which wastes time by reading the whole file without any visible effect: @example :eat $d @i{Quit silently on the last line} N @i{Read another line, silently} g @i{Overwrite pattern space each time to save memory} b eat @end example @item R @var{filename} @findex R (read line) command @cindex Read text from a file @cindex @value{SSEDEXT}, reading a file a line at a time @cindex @value{SSEDEXT}, @code{R} command @cindex @value{SSEDEXT}, @file{/dev/stdin} file Queue a line of @var{filename} to be read and inserted into the output stream at the end of the current cycle, or when the next input line is read. Note that if @var{filename} cannot be read, or if its end is reached, no line is appended, without any error indication. As with the @code{r} command, the special value @file{/dev/stdin} is supported for the file name, which reads a line from the standard input. @item T @var{label} @findex T (test and branch if failed) command @cindex @value{SSEDEXT}, branch if @code{s///} failed @cindex Branch to a label, if @code{s///} failed @cindex Conditional branch Branch to @var{label} only if there have been no successful @code{s}ubstitutions since the last input line was read or conditional branch was taken. The @var{label} may be omitted, in which case the next cycle is started. @item v @var{version} @findex v (version) command @cindex @value{SSEDEXT}, checking for their presence @cindex Requiring @value{SSED} This command does nothing, but makes @command{sed} fail if @value{SSED} extensions are not supported, simply because other versions of @command{sed} do not implement it. In addition, you can specify the version of @command{sed} that your script requires, such as @code{4.0.5}. The default is @code{4.0} because that is the first version that implemented this command. This command enables all @value{SSEDEXT} even if @env{POSIXLY_CORRECT} is set in the environment. @item W @var{filename} @findex W (write first line) command @cindex Write first line to a file @cindex @value{SSEDEXT}, writing first line to a file Write to the given filename the portion of the pattern space up to the first newline. Everything said under the @code{w} command about file handling holds here too. @end table @node Escapes @section @acronym{GNU} Extensions for Escapes in Regular Expressions @cindex @acronym{GNU} extensions, special escapes Until this chapter, we have only encountered escapes of the form @samp{\^}, which tell @command{sed} not to interpret the circumflex as a special character, but rather to take it literally. For example, @samp{\*} matches a single asterisk rather than zero or more backslashes. @cindex @code{POSIXLY_CORRECT} behavior, escapes This chapter introduces another kind of escape@footnote{All the escapes introduced here are @acronym{GNU} extensions, with the exception of @code{\n}. In basic regular expression mode, setting @code{POSIXLY_CORRECT} disables them inside bracket expressions.}---that is, escapes that are applied to a character or sequence of characters that ordinarily are taken literally, and that @command{sed} replaces with a special character. This provides a way of encoding non-printable characters in patterns in a visible manner. There is no restriction on the appearance of non-printing characters in a @command{sed} script but when a script is being prepared in the shell or by text editing, it is usually easier to use one of the following escape sequences than the binary character it represents: The list of these escapes is: @table @code @item \a Produces or matches a @sc{bel} character, that is an ``alert'' (@sc{ascii} 7). @item \f Produces or matches a form feed (@sc{ascii} 12). @item \n Produces or matches a newline (@sc{ascii} 10). @item \r Produces or matches a carriage return (@sc{ascii} 13). @item \t Produces or matches a horizontal tab (@sc{ascii} 9). @item \v Produces or matches a so called ``vertical tab'' (@sc{ascii} 11). @item \c@var{x} Produces or matches @kbd{@sc{Control}-@var{x}}, where @var{x} is any character. The precise effect of @samp{\c@var{x}} is as follows: if @var{x} is a lower case letter, it is converted to upper case. Then bit 6 of the character (hex 40) is inverted. Thus @samp{\cz} becomes hex 1A, but @samp{\c@{} becomes hex 3B, while @samp{\c;} becomes hex 7B. @item \d@var{xxx} Produces or matches a character whose decimal @sc{ascii} value is @var{xxx}. @item \o@var{xxx} @ifset PERL @item \@var{xxx} @end ifset Produces or matches a character whose octal @sc{ascii} value is @var{xxx}. @ifset PERL The syntax without the @code{o} is active in Perl mode, while the one with the @code{o} is active in the normal or extended @sc{posix} regular expression modes. @end ifset @item \x@var{xx} Produces or matches a character whose hexadecimal @sc{ascii} value is @var{xx}. @end table @samp{\b} (backspace) was omitted because of the conflict with the existing ``word boundary'' meaning. Other escapes match a particular character class and are valid only in regular expressions: @table @code @item \w Matches any ``word'' character. A ``word'' character is any letter or digit or the underscore character. @item \W Matches any ``non-word'' character. @item \b Matches a word boundary; that is it matches if the character to the left is a ``word'' character and the character to the right is a ``non-word'' character, or vice-versa. @item \B Matches everywhere but on a word boundary; that is it matches if the character to the left and the character to the right are either both ``word'' characters or both ``non-word'' characters. @item \` Matches only at the start of pattern space. This is different from @code{^} in multi-line mode. @item \' Matches only at the end of pattern space. This is different from @code{$} in multi-line mode. @ifset PERL @item \G Match only at the start of pattern space or, when doing a global substitution using the @code{s///g} command and option, at the end-of-match position of the prior match. For example, @samp{s/\Ga/Z/g} will change an initial run of @code{a}s to a run of @code{Z}s @end ifset @end table @node Examples @chapter Some Sample Scripts Here are some @command{sed} scripts to guide you in the art of mastering @command{sed}. @menu Some exotic examples: * Centering lines:: * Increment a number:: * Rename files to lower case:: * Print bash environment:: * Reverse chars of lines:: Emulating standard utilities: * tac:: Reverse lines of files * cat -n:: Numbering lines * cat -b:: Numbering non-blank lines * wc -c:: Counting chars * wc -w:: Counting words * wc -l:: Counting lines * head:: Printing the first lines * tail:: Printing the last lines * uniq:: Make duplicate lines unique * uniq -d:: Print duplicated lines of input * uniq -u:: Remove all duplicated lines * cat -s:: Squeezing blank lines @end menu @node Centering lines @section Centering Lines This script centers all lines of a file on a 80 columns width. To change that width, the number in @code{\@{@dots{}\@}} must be replaced, and the number of added spaces also must be changed. Note how the buffer commands are used to separate parts in the regular expressions to be matched---this is a common technique. @c start------------------------------------------- @example #!/usr/bin/sed -f @group # Put 80 spaces in the buffer 1 @{ x s/^$/ / s/^.*$/&&&&&&&&/ x @} @end group @group # del leading and trailing spaces y/@kbd{tab}/ / s/^ *// s/ *$// @end group @group # add a newline and 80 spaces to end of line G @end group @group # keep first 81 chars (80 + a newline) s/^\(.\@{81\@}\).*$/\1/ @end group @group # \2 matches half of the spaces, which are moved to the beginning s/^\(.*\)\n\(.*\)\2/\2\1/ @end group @end example @c end--------------------------------------------- @node Increment a number @section Increment a Number This script is one of a few that demonstrate how to do arithmetic in @command{sed}. This is indeed possible,@footnote{@command{sed} guru Greg Ubben wrote an implementation of the @command{dc} @sc{rpn} calculator! It is distributed together with sed.} but must be done manually. To increment one number you just add 1 to last digit, replacing it by the following digit. There is one exception: when the digit is a nine the previous digits must be also incremented until you don't have a nine. This solution by Bruno Haible is very clever and smart because it uses a single buffer; if you don't have this limitation, the algorithm used in @ref{cat -n, Numbering lines}, is faster. It works by replacing trailing nines with an underscore, then using multiple @code{s} commands to increment the last digit, and then again substituting underscores with zeros. @c start------------------------------------------- @example #!/usr/bin/sed -f /[^0-9]/ d @group # replace all leading 9s by _ (any other character except digits, could # be used) :d s/9\(_*\)$/_\1/ td @end group @group # incr last digit only. The first line adds a most-significant # digit of 1 if we have to add a digit. # # The @code{tn} commands are not necessary, but make the thing # faster @end group @group s/^\(_*\)$/1\1/; tn s/8\(_*\)$/9\1/; tn s/7\(_*\)$/8\1/; tn s/6\(_*\)$/7\1/; tn s/5\(_*\)$/6\1/; tn s/4\(_*\)$/5\1/; tn s/3\(_*\)$/4\1/; tn s/2\(_*\)$/3\1/; tn s/1\(_*\)$/2\1/; tn s/0\(_*\)$/1\1/; tn @end group @group :n y/_/0/ @end group @end example @c end--------------------------------------------- @node Rename files to lower case @section Rename Files to Lower Case This is a pretty strange use of @command{sed}. We transform text, and transform it to be shell commands, then just feed them to shell. Don't worry, even worse hacks are done when using @command{sed}; I have seen a script converting the output of @command{date} into a @command{bc} program! The main body of this is the @command{sed} script, which remaps the name from lower to upper (or vice-versa) and even checks out if the remapped name is the same as the original name. Note how the script is parameterized using shell variables and proper quoting. @c start------------------------------------------- @example @group #! /bin/sh # rename files to lower/upper case... # # usage: # move-to-lower * # move-to-upper * # or # move-to-lower -R . # move-to-upper -R . # @end group @group help() @{ cat << eof Usage: $0 [-n] [-r] [-h] files... @end group @group -n do nothing, only see what would be done -R recursive (use find) -h this message files files to remap to lower case @end group @group Examples: $0 -n * (see if everything is ok, then...) $0 * @end group $0 -R . @group eof @} @end group @group apply_cmd='sh' finder='echo "$@@" | tr " " "\n"' files_only= @end group @group while : do case "$1" in -n) apply_cmd='cat' ;; -R) finder='find "$@@" -type f';; -h) help ; exit 1 ;; *) break ;; esac shift done @end group @group if [ -z "$1" ]; then echo Usage: $0 [-h] [-n] [-r] files... exit 1 fi @end group @group LOWER='abcdefghijklmnopqrstuvwxyz' UPPER='ABCDEFGHIJKLMNOPQRSTUVWXYZ' @end group @group case `basename $0` in *upper*) TO=$UPPER; FROM=$LOWER ;; *) FROM=$UPPER; TO=$LOWER ;; esac @end group eval $finder | sed -n ' @group # remove all trailing slashes s/\/*$// @end group @group # add ./ if there is no path, only a filename /\//! s/^/.\// @end group @group # save path+filename h @end group @group # remove path s/.*\/// @end group @group # do conversion only on filename y/'$FROM'/'$TO'/ @end group @group # now line contains original path+file, while # hold space contains the new filename x @end group @group # add converted file name to line, which now contains # path/file-name\nconverted-file-name G @end group @group # check if converted file name is equal to original file name, # if it is, do not print nothing /^.*\/\(.*\)\n\1/b @end group @group # now, transform path/fromfile\n, into # mv path/fromfile path/tofile and print it s/^\(.*\/\)\(.*\)\n\(.*\)$/mv \1\2 \1\3/p @end group ' | $apply_cmd @end example @c end--------------------------------------------- @node Print bash environment @section Print @command{bash} Environment This script strips the definition of the shell functions from the output of the @command{set} Bourne-shell command. @c start------------------------------------------- @example #!/bin/sh @group set | sed -n ' :x @end group @group @ifinfo # if no occurrence of "=()" print and load next line @end ifinfo @ifnotinfo # if no occurrence of @samp{=()} print and load next line @end ifnotinfo /=()/! @{ p; b; @} / () $/! @{ p; b; @} @end group @group # possible start of functions section # save the line in case this is a var like FOO="() " h @end group @group # if the next line has a brace, we quit because # nothing comes after functions n /^@{/ q @end group @group # print the old line x; p @end group @group # work on the new line now x; bx ' @end group @end example @c end--------------------------------------------- @node Reverse chars of lines @section Reverse Characters of Lines This script can be used to reverse the position of characters in lines. The technique moves two characters at a time, hence it is faster than more intuitive implementations. Note the @code{tx} command before the definition of the label. This is often needed to reset the flag that is tested by the @code{t} command. Imaginative readers will find uses for this script. An example is reversing the output of @command{banner}.@footnote{This requires another script to pad the output of banner; for example @example #! /bin/sh banner -w $1 $2 $3 $4 | sed -e :a -e '/^.\@{0,'$1'\@}$/ @{ s/$/ /; ba; @}' | ~/sedscripts/reverseline.sed @end example } @c start------------------------------------------- @example #!/usr/bin/sed -f /../! b @group # Reverse a line. Begin embedding the line between two newlines s/^.*$/\ &\ / @end group @group # Move first character at the end. The regexp matches until # there are zero or one characters between the markers tx :x s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/ tx @end group @group # Remove the newline markers s/\n//g @end group @end example @c end--------------------------------------------- @node tac @section Reverse Lines of Files This one begins a series of totally useless (yet interesting) scripts emulating various Unix commands. This, in particular, is a @command{tac} workalike. Note that on implementations other than @acronym{GNU} @command{sed} @ifset PERL and @value{SSED} @end ifset this script might easily overflow internal buffers. @c start------------------------------------------- @example #!/usr/bin/sed -nf # reverse all lines of input, i.e. first line became last, ... @group # from the second line, the buffer (which contains all previous lines) # is *appended* to current line, so, the order will be reversed 1! G @end group @group # on the last line we're done -- print everything $ p @end group @group # store everything on the buffer again h @end group @end example @c end--------------------------------------------- @node cat -n @section Numbering Lines This script replaces @samp{cat -n}; in fact it formats its output exactly like @acronym{GNU} @command{cat} does. Of course this is completely useless and for two reasons: first, because somebody else did it in C, second, because the following Bourne-shell script could be used for the same purpose and would be much faster: @c start------------------------------------------- @example @group #! /bin/sh sed -e "=" $@@ | sed -e ' s/^/ / N s/^ *\(......\)\n/\1 / ' @end group @end example @c end--------------------------------------------- It uses @command{sed} to print the line number, then groups lines two by two using @code{N}. Of course, this script does not teach as much as the one presented below. The algorithm used for incrementing uses both buffers, so the line is printed as soon as possible and then discarded. The number is split so that changing digits go in a buffer and unchanged ones go in the other; the changed digits are modified in a single step (using a @code{y} command). The line number for the next line is then composed and stored in the hold space, to be used in the next iteration. @c start------------------------------------------- @example #!/usr/bin/sed -nf @group # Prime the pump on the first line x /^$/ s/^.*$/1/ @end group @group # Add the correct line number before the pattern G h @end group @group # Format it and print it s/^/ / s/^ *\(......\)\n/\1 /p @end group @group # Get the line number from hold space; add a zero # if we're going to add a digit on the next line g s/\n.*$// /^9*$/ s/^/0/ @end group @group # separate changing/unchanged digits with an x s/.9*$/x&/ @end group @group # keep changing digits in hold space h s/^.*x// y/0123456789/1234567890/ x @end group @group # keep unchanged digits in pattern space s/x.*$// @end group @group # compose the new number, remove the newline implicitly added by G G s/\n// h @end group @end example @c end--------------------------------------------- @node cat -b @section Numbering Non-blank Lines Emulating @samp{cat -b} is almost the same as @samp{cat -n}---we only have to select which lines are to be numbered and which are not. The part that is common to this script and the previous one is not commented to show how important it is to comment @command{sed} scripts properly... @c start------------------------------------------- @example #!/usr/bin/sed -nf @group /^$/ @{ p b @} @end group @group # Same as cat -n from now x /^$/ s/^.*$/1/ G h s/^/ / s/^ *\(......\)\n/\1 /p x s/\n.*$// /^9*$/ s/^/0/ s/.9*$/x&/ h s/^.*x// y/0123456789/1234567890/ x s/x.*$// G s/\n// h @end group @end example @c end--------------------------------------------- @node wc -c @section Counting Characters This script shows another way to do arithmetic with @command{sed}. In this case we have to add possibly large numbers, so implementing this by successive increments would not be feasible (and possibly even more complicated to contrive than this script). The approach is to map numbers to letters, kind of an abacus implemented with @command{sed}. @samp{a}s are units, @samp{b}s are tenths and so on: we simply add the number of characters on the current line as units, and then propagate the carry to tenths, hundredths, and so on. As usual, running totals are kept in hold space. On the last line, we convert the abacus form back to decimal. For the sake of variety, this is done with a loop rather than with some 80 @code{s} commands@footnote{Some implementations have a limit of 199 commands per script}: first we convert units, removing @samp{a}s from the number; then we rotate letters so that tenths become @samp{a}s, and so on until no more letters remain. @c start------------------------------------------- @example #!/usr/bin/sed -nf @group # Add n+1 a's to hold space (+1 is for the newline) s/./a/g H x s/\n/a/ @end group @group # Do the carry. The t's and b's are not necessary, # but they do speed up the thing t a : a; s/aaaaaaaaaa/b/g; t b; b done : b; s/bbbbbbbbbb/c/g; t c; b done : c; s/cccccccccc/d/g; t d; b done : d; s/dddddddddd/e/g; t e; b done : e; s/eeeeeeeeee/f/g; t f; b done : f; s/ffffffffff/g/g; t g; b done : g; s/gggggggggg/h/g; t h; b done : h; s/hhhhhhhhhh//g @end group @group : done $! @{ h b @} @end group # On the last line, convert back to decimal @group : loop /a/! s/[b-h]*/&0/ s/aaaaaaaaa/9/ s/aaaaaaaa/8/ s/aaaaaaa/7/ s/aaaaaa/6/ s/aaaaa/5/ s/aaaa/4/ s/aaa/3/ s/aa/2/ s/a/1/ @end group @group : next y/bcdefgh/abcdefg/ /[a-h]/ b loop p @end group @end example @c end--------------------------------------------- @node wc -w @section Counting Words This script is almost the same as the previous one, once each of the words on the line is converted to a single @samp{a} (in the previous script each letter was changed to an @samp{a}). It is interesting that real @command{wc} programs have optimized loops for @samp{wc -c}, so they are much slower at counting words rather than characters. This script's bottleneck, instead, is arithmetic, and hence the word-counting one is faster (it has to manage smaller numbers). Again, the common parts are not commented to show the importance of commenting @command{sed} scripts. @c start------------------------------------------- @example #!/usr/bin/sed -nf @group # Convert words to a's s/[ @kbd{tab}][ @kbd{tab}]*/ /g s/^/ / s/ [^ ][^ ]*/a /g s/ //g @end group @group # Append them to hold space H x s/\n// @end group @group # From here on it is the same as in wc -c. /aaaaaaaaaa/! bx; s/aaaaaaaaaa/b/g /bbbbbbbbbb/! bx; s/bbbbbbbbbb/c/g /cccccccccc/! bx; s/cccccccccc/d/g /dddddddddd/! bx; s/dddddddddd/e/g /eeeeeeeeee/! bx; s/eeeeeeeeee/f/g /ffffffffff/! bx; s/ffffffffff/g/g /gggggggggg/! bx; s/gggggggggg/h/g s/hhhhhhhhhh//g :x $! @{ h; b; @} :y /a/! s/[b-h]*/&0/ s/aaaaaaaaa/9/ s/aaaaaaaa/8/ s/aaaaaaa/7/ s/aaaaaa/6/ s/aaaaa/5/ s/aaaa/4/ s/aaa/3/ s/aa/2/ s/a/1/ y/bcdefgh/abcdefg/ /[a-h]/ by p @end group @end example @c end--------------------------------------------- @node wc -l @section Counting Lines No strange things are done now, because @command{sed} gives us @samp{wc -l} functionality for free!!! Look: @c start------------------------------------------- @example @group #!/usr/bin/sed -nf $= @end group @end example @c end--------------------------------------------- @node head @section Printing the First Lines This script is probably the simplest useful @command{sed} script. It displays the first 10 lines of input; the number of displayed lines is right before the @code{q} command. @c start------------------------------------------- @example @group #!/usr/bin/sed -f 10q @end group @end example @c end--------------------------------------------- @node tail @section Printing the Last Lines Printing the last @var{n} lines rather than the first is more complex but indeed possible. @var{n} is encoded in the second line, before the bang character. This script is similar to the @command{tac} script in that it keeps the final output in the hold space and prints it at the end: @c start------------------------------------------- @example #!/usr/bin/sed -nf @group 1! @{; H; g; @} 1,10 !s/[^\n]*\n// $p h @end group @end example @c end--------------------------------------------- Mainly, the scripts keeps a window of 10 lines and slides it by adding a line and deleting the oldest (the substitution command on the second line works like a @code{D} command but does not restart the loop). The ``sliding window'' technique is a very powerful way to write efficient and complex @command{sed} scripts, because commands like @code{P} would require a lot of work if implemented manually. To introduce the technique, which is fully demonstrated in the rest of this chapter and is based on the @code{N}, @code{P} and @code{D} commands, here is an implementation of @command{tail} using a simple ``sliding window.'' This looks complicated but in fact the working is the same as the last script: after we have kicked in the appropriate number of lines, however, we stop using the hold space to keep inter-line state, and instead use @code{N} and @code{D} to slide pattern space by one line: @c start------------------------------------------- @example #!/usr/bin/sed -f @group 1h 2,10 @{; H; g; @} $q 1,9d N D @end group @end example @c end--------------------------------------------- @node uniq @section Make Duplicate Lines Unique This is an example of the art of using the @code{N}, @code{P} and @code{D} commands, probably the most difficult to master. @c start------------------------------------------- @example @group #!/usr/bin/sed -f h @end group @group :b # On the last line, print and exit $b N /^\(.*\)\n\1$/ @{ # The two lines are identical. Undo the effect of # the n command. g bb @} @end group @group # If the @code{N} command had added the last line, print and exit $b @end group @group # The lines are different; print the first and go # back working on the second. P D @end group @end example @c end--------------------------------------------- As you can see, we mantain a 2-line window using @code{P} and @code{D}. This technique is often used in advanced @command{sed} scripts. @node uniq -d @section Print Duplicated Lines of Input This script prints only duplicated lines, like @samp{uniq -d}. @c start------------------------------------------- @example #!/usr/bin/sed -nf @group $b N /^\(.*\)\n\1$/ @{ # Print the first of the duplicated lines s/.*\n// p @end group @group # Loop until we get a different line :b $b N /^\(.*\)\n\1$/ @{ s/.*\n// bb @} @} @end group @group # The last line cannot be followed by duplicates $b @end group @group # Found a different one. Leave it alone in the pattern space # and go back to the top, hunting its duplicates D @end group @end example @c end--------------------------------------------- @node uniq -u @section Remove All Duplicated Lines This script prints only unique lines, like @samp{uniq -u}. @c start------------------------------------------- @example #!/usr/bin/sed -f @group # Search for a duplicate line --- until that, print what you find. $b N /^\(.*\)\n\1$/ ! @{ P D @} @end group @group :c # Got two equal lines in pattern space. At the # end of the file we simply exit $d @end group @group # Else, we keep reading lines with @code{N} until we # find a different one s/.*\n// N /^\(.*\)\n\1$/ @{ bc @} @end group @group # Remove the last instance of the duplicate line # and go back to the top D @end group @end example @c end--------------------------------------------- @node cat -s @section Squeezing Blank Lines As a final example, here are three scripts, of increasing complexity and speed, that implement the same function as @samp{cat -s}, that is squeezing blank lines. The first leaves a blank line at the beginning and end if there are some already. @c start------------------------------------------- @example #!/usr/bin/sed -f @group # on empty lines, join with next # Note there is a star in the regexp :x /^\n*$/ @{ N bx @} @end group @group # now, squeeze all '\n', this can be also done by: # s/^\(\n\)*/\1/ s/\n*/\ / @end group @end example @c end--------------------------------------------- This one is a bit more complex and removes all empty lines at the beginning. It does leave a single blank line at end if one was there. @c start------------------------------------------- @example #!/usr/bin/sed -f @group # delete all leading empty lines 1,/^./@{ /./!d @} @end group @group # on an empty line we remove it and all the following # empty lines, but one :x /./!@{ N s/^\n$// tx @} @end group @end example @c end--------------------------------------------- This removes leading and trailing blank lines. It is also the fastest. Note that loops are completely done with @code{n} and @code{b}, without exploting the fact that @command{sed} cycles back to the top of the script automatically at the end of a line. @c start------------------------------------------- @example #!/usr/bin/sed -nf @group # delete all (leading) blanks /./!d @end group @group # get here: so there is a non empty :x # print it p # get next n # got chars? print it again, etc... /./bx @end group @group # no, don't have chars: got an empty line :z # get next, if last line we finish here so no trailing # empty lines are written n # also empty? then ignore it, and get next... this will # remove ALL empty lines /./!bz @end group @group # all empty lines were deleted/ignored, but we have a non empty. As # what we want to do is to squeeze, insert a blank line artificially i\ @end group bx @end example @c end--------------------------------------------- @node Limitations @chapter @value{SSED}'s Limitations and Non-limitations @cindex @acronym{GNU} extensions, unlimited line length @cindex Portability, line length limitations For those who want to write portable @command{sed} scripts, be aware that some implementations have been known to limit line lengths (for the pattern and hold spaces) to be no more than 4000 bytes. The @sc{posix} standard specifies that conforming @command{sed} implementations shall support at least 8192 byte line lengths. @value{SSED} has no built-in limit on line length; as long as it can @code{malloc()} more (virtual) memory, you can feed or construct lines as long as you like. However, recursion is used to handle subpatterns and indefinite repetition. This means that the available stack space may limit the size of the buffer that can be processed by certain patterns. @ifset PERL There are some size limitations in the regular expression matcher but it is hoped that they will never in practice be relevant. The maximum length of a compiled pattern is 65539 (sic) bytes. All values in repeating quantifiers must be less than 65536. The maximum nesting depth of all parenthesized subpatterns, including capturing and non-capturing subpatterns@footnote{The distinction is meaningful when referring to Perl-style regular expressions.}, assertions, and other types of subpattern, is 200. Also, @value{SSED} recognizes the @sc{posix} syntax @code{[.@var{ch}.]} and @code{[=@var{ch}=]} where @var{ch} is a ``collating element'', but these are not supported, and an error is given if they are encountered. Here are a few distinctions between the real Perl-style regular expressions and those that @option{-R} recognizes. @enumerate @item Lookahead assertions do not allow repeat quantifiers after them Perl permits them, but they do not mean what you might think. For example, @samp{(?!a)@{3@}} does not assert that the next three characters are not @samp{a}. It just asserts three times that the next character is not @samp{a} --- a waste of time and nothing else. @item Capturing subpatterns that occur inside negative lookahead head assertions are counted, but their entries are counted as empty in the second half of an @code{s} command. Perl sets its numerical variables from any such patterns that are matched before the assertion fails to match something (thereby succeeding), but only if the negative lookahead assertion contains just one branch. @item The following Perl escape sequences are not supported: @samp{\l}, @samp{\u}, @samp{\L}, @samp{\U}, @samp{\E}, @samp{\Q}. In fact these are implemented by Perl's general string-handling and are not part of its pattern matching engine. @item The Perl @samp{\G} assertion is not supported as it is not relevant to single pattern matches. @item Fairly obviously, @value{SSED} does not support the @samp{(?@{code@})} and @samp{(?p@{code@})} constructions. However, there is some experimental support for recursive patterns using the non-Perl item @samp{(?R)}. @item There are at the time of writing some oddities in Perl 5.005_02 concerned with the settings of captured strings when part of a pattern is repeated. For example, matching @samp{aba} against the pattern @samp{/^(a(b)?)+$/} sets @samp{$2}@footnote{@samp{$2} would be @samp{\2} in @value{SSED}.} to the value @samp{b}, but matching @samp{aabbaa} against @samp{/^(aa(bb)?)+$/} leaves @samp{$2} unset. However, if the pattern is changed to @samp{/^(aa(b(b))?)+$/} then @samp{$2} (and @samp{$3}) are set. In Perl 5.004 @samp{$2} is set in both cases, and that is also true of @value{SSED}. @item Another as yet unresolved discrepancy is that in Perl 5.005_02 the pattern @samp{/^(a)?(?(1)a|b)+$/} matches the string @samp{a}, whereas in @value{SSED} it does not. However, in both Perl and @value{SSED} @samp{/^(a)?a/} matched against @samp{a} leaves $1 unset. @end enumerate @end ifset @node Other Resources @chapter Other Resources for Learning About @command{sed} @cindex Additional reading about @command{sed} In addition to several books that have been written about @command{sed} (either specifically or as chapters in books which discuss shell programming), one can find out more about @command{sed} (including suggestions of a few books) from the FAQ for the @code{sed-users} mailing list, available from any of: @display @uref{http://www.student.northpark.edu/pemente/sed/sedfaq.html} @uref{http://sed.sf.net/grabbag/tutorials/sedfaq.html} @end display Also of interest are @uref{http://www.student.northpark.edu/pemente/sed/index.htm} and @uref{http://sed.sf.net/grabbag}, which include @command{sed} tutorials and other @command{sed}-related goodies. The @code{sed-users} mailing list itself maintained by Sven Guckes. To subscribe, visit @uref{http://groups.yahoo.com} and search for the @code{sed-users} mailing list. @node Reporting Bugs @chapter Reporting Bugs @cindex Bugs, reporting Email bug reports to @email{bonzini@@gnu.org}. Be sure to include the word ``sed'' somewhere in the @code{Subject:} field. Also, please include the output of @samp{sed --version} in the body of your report if at all possible. Please do not send a bug report like this: @example @i{while building frobme-1.3.4} $ configure @error{} sed: file sedscr line 1: Unknown option to 's' @end example If @value{SSED} doesn't configure your favorite package, take a few extra minutes to identify the specific problem and make a stand-alone test case. Unlike other programs such as C compilers, making such test cases for @command{sed} is quite simple. A stand-alone test case includes all the data necessary to perform the test, and the specific invocation of @command{sed} that causes the problem. The smaller a stand-alone test case is, the better. A test case should not involve something as far removed from @command{sed} as ``try to configure frobme-1.3.4''. Yes, that is in principle enough information to look for the bug, but that is not a very practical prospect. Here are a few commonly reported bugs that are not bugs. @table @asis @item @code{N} command on the last line @cindex Portability, @code{N} command on the last line @cindex Non-bugs, @code{N} command on the last line Most versions of @command{sed} exit without printing anything when the @command{N} command is issued on the last line of a file. @value{SSED} prints pattern space before exiting unless of course the @command{-n} command switch has been specified. This choice is by design. For example, the behavior of @example sed N foo bar @end example @noindent would depend on whether foo has an even or an odd number of lines@footnote{which is the actual ``bug'' that prompted the change in behavior}. Or, when writing a script to read the next few lines following a pattern match, traditional implementations of @code{sed} would force you to write something like @example /foo/@{ $!N; $!N; $!N; $!N; $!N; $!N; $!N; $!N; $!N @} @end example @noindent instead of just @example /foo/@{ N;N;N;N;N;N;N;N;N; @} @end example @cindex @code{POSIXLY_CORRECT} behavior, @code{N} command In any case, the simplest workaround is to use @code{$d;N} in scripts that rely on the traditional behavior, or to set the @code{POSIXLY_CORRECT} variable to a non-empty value. @item Regex syntax clashes (problems with backslashes) @cindex @acronym{GNU} extensions, to basic regular expressions @cindex Non-bugs, regex syntax clashes @command{sed} uses the @sc{posix} basic regular expression syntax. According to the standard, the meaning of some escape sequences is undefined in this syntax; notable in the case of @command{sed} are @code{\|}, @code{\+}, @code{\?}, @code{\`}, @code{\'}, @code{\<}, @code{\>}, @code{\b}, @code{\B}, @code{\w}, and @code{\W}. As in all @acronym{GNU} programs that use @sc{posix} basic regular expressions, @command{sed} interprets these escape sequences as special characters. So, @code{x\+} matches one or more occurrences of @samp{x}. @code{abc\|def} matches either @samp{abc} or @samp{def}. This syntax may cause problems when running scripts written for other @command{sed}s. Some @command{sed} programs have been written with the assumption that @code{\|} and @code{\+} match the literal characters @code{|} and @code{+}. Such scripts must be modified by removing the spurious backslashes if they are to be used with modern implementations of @command{sed}, like @ifset PERL @value{SSED} or @end ifset @acronym{GNU} @command{sed}. On the other hand, some scripts use s|abc\|def||g to remove occurrences of @emph{either} @code{abc} or @code{def}. While this worked until @command{sed} 4.0.x, newer versions interpret this as removing the string @code{abc|def}. This is again undefined behavior according to @acronym{POSIX}, and this interpretation is arguably more robust: older @command{sed}s, for example, required that the regex matcher parsed @code{\/} as @code{/} in the common case of escaping a slash, which is again undefined behavior; the new behavior avoids this, and this is good because the regex matcher is only partially under our control. @cindex @acronym{GNU} extensions, special escapes In addition, this version of @command{sed} supports several escape characters (some of which are multi-character) to insert non-printable characters in scripts (@code{\a}, @code{\c}, @code{\d}, @code{\o}, @code{\r}, @code{\t}, @code{\v}, @code{\x}). These can cause similar problems with scripts written for other @command{sed}s. @item @option{-i} clobbers read-only files @cindex In-place editing @cindex @value{SSEDEXT}, in-place editing @cindex Non-bugs, in-place editing In short, @samp{sed -i} will let you delete the contents of a read-only file, and in general the @option{-i} option (@pxref{Invoking sed, , Invocation}) lets you clobber protected files. This is not a bug, but rather a consequence of how the Unix filesystem works. The permissions on a file say what can happen to the data in that file, while the permissions on a directory say what can happen to the list of files in that directory. @samp{sed -i} will not ever open for writing a file that is already on disk. Rather, it will work on a temporary file that is finally renamed to the original name: if you rename or delete files, you're actually modifying the contents of the directory, so the operation depends on the permissions of the directory, not of the file. For this same reason, @command{sed} does not let you use @option{-i} on a writeable file in a read-only directory (but unbelievably nobody reports that as a bug@dots{}). @item @code{0a} does not work (gives an error) There is no line 0. 0 is a special address that is only used to treat addresses like @code{0,/@var{RE}/} as active when the script starts: if you write @code{1,/abc/d} and the first line includes the word @samp{abc}, then that match would be ignored because address ranges must span at least two lines (barring the end of the file); but what you probably wanted is to delete every line up to the first one including @samp{abc}, and this is obtained with @code{0,/abc/d}. @ifclear PERL @item @code{[a-z]} is case insensitive You are encountering problems with locales. POSIX mandates that @code{[a-z]} uses the current locale's collation order -- in C parlance, that means using @code{strcoll(3)} instead of @code{strcmp(3)}. Some locales have a case-insensitive collation order, others don't: one of those that have problems is Estonian. Another problem is that @code{[a-z]} tries to use collation symbols. This only happens if you are on the @acronym{GNU} system, using @acronym{GNU} libc's regular expression matcher instead of compiling the one supplied with @acronym{GNU} sed. In a Danish locale, for example, the regular expression @code{^[a-z]$} matches the string @samp{aa}, because this is a single collating symbol that comes after @samp{a} and before @samp{b}; @samp{ll} behaves similarly in Spanish locales, or @samp{ij} in Dutch locales. To work around these problems, which may cause bugs in shell scripts, set the @env{LC_COLLATE} and @env{LC_CTYPE} environment variables to @samp{C}. @end ifclear @end table @node Extended regexps @appendix Extended regular expressions @cindex Extended regular expressions, syntax The only difference between basic and extended regular expressions is in the behavior of a few characters: @samp{?}, @samp{+}, parentheses, and braces (@samp{@{@}}). While basic regular expressions require these to be escaped if you want them to behave as special characters, when using extended regular expressions you must escape them if you want them @emph{to match a literal character}. @noindent Examples: @table @code @item abc? becomes @samp{abc\?} when using extended regular expressions. It matches the literal string @samp{abc?}. @item c\+ becomes @samp{c+} when using extended regular expressions. It matches one or more @samp{c}s. @item a\@{3,\@} becomes @samp{a@{3,@}} when using extended regular expressions. It matches three or more @samp{a}s. @item \(abc\)\@{2,3\@} becomes @samp{(abc)@{2,3@}} when using extended regular expressions. It matches either @samp{abcabc} or @samp{abcabcabc}. @item \(abc*\)\1 becomes @samp{(abc*)\1} when using extended regular expressions. Backreferences must still be escaped when using extended regular expressions. @end table @ifset PERL @node Perl regexps @appendix Perl-style regular expressions @cindex Perl-style regular expressions, syntax @emph{This part is taken from the @file{pcre.txt} file distributed together with the free @sc{pcre} regular expression matcher; it was written by Philip Hazel.} Perl introduced several extensions to regular expressions, some of them incompatible with the syntax of regular expressions accepted by Emacs and other @acronym{GNU} tools (whose matcher was based on the Emacs matcher). @value{SSED} implements both kinds of extensions. @iftex Summarizing, we have: @itemize @bullet @item A backslash can introduce several special sequences @item The circumflex, dollar sign, and period characters behave specially with regard to new lines @item Strange uses of square brackets are parsed differently @item You can toggle modifiers in the middle of a regular expression @item You can specify that a subpattern does not count when numbering backreferences @item @cindex Greedy regular expression matching You can specify greedy or non-greedy matching @item You can have more than ten back references @item You can do complex look aheads and look behinds (in the spirit of @code{\b}, but with subpatterns). @item You can often improve performance by avoiding that @command{sed} wastes time with backtracking @item You can have if/then/else branches @item You can do recursive matches, for example to look for unbalanced parentheses @item You can have comments and non-significant whitespace, because things can get complex... @end itemize Most of these extensions are introduced by the special @code{(?} sequence, which gives special meanings to parenthesized groups. @end iftex @menu Other extensions can be roughly subdivided in two categories On one hand Perl introduces several more escaped sequences (that is, sequences introduced by a backslash). On the other hand, it specifies that if a question mark follows an open parentheses it should give a special meaning to the parenthesized group. * Backslash:: Introduces special sequences * Circumflex/dollar sign/period:: Behave specially with regard to new lines * Square brackets:: Are a bit different in strange cases * Options setting:: Toggle modifiers in the middle of a regexp * Non-capturing subpatterns:: Are not counted when backreferencing * Repetition:: Allows for non-greedy matching * Backreferences:: Allows for more than 10 back references * Assertions:: Allows for complex look ahead matches * Non-backtracking subpatterns:: Often gives more performance * Conditional subpatterns:: Allows if/then/else branches * Recursive patterns:: For example to match parentheses * Comments:: Because things can get complex... @end menu @node Backslash @appendixsec Backslash @cindex Perl-style regular expressions, escaped sequences There are a few difference in the handling of backslashed sequences in Perl mode. First of all, there are no @code{\o} and @code{\d} sequences. @sc{ascii} values for characters can be specified in octal with a @code{\@var{xxx}} sequence, where @var{xxx} is a sequence of up to three octal digits. If the first digit is a zero, the treatment of the sequence is straightforward; just note that if the character that follows the escaped digit is itself an octal digit, you have to supply three octal digits for @var{xxx}. For example @code{\07} is a @sc{bel} character rather than a @sc{nul} and a literal @code{7} (this sequence is instead represented by @code{\0007}). @cindex Perl-style regular expressions, backreferences The handling of a backslash followed by a digit other than 0 is complicated. Outside a character class, @command{sed} reads it and any following digits as a decimal number. If the number is less than 10, or if there have been at least that many previous capturing left parentheses in the expression, the entire sequence is taken as a back reference. A description of how this works is given later, following the discussion of parenthesized subpatterns. Inside a character class, or if the decimal number is greater than 9 and there have not been that many capturing subpatterns, @command{sed} re-reads up to three octal digits following the backslash, and generates a single byte from the least significant 8 bits of the value. Any subsequent digits stand for themselves. For example: @example \040 @i{is another way of writing a space} \40 @i{is the same, provided there are fewer than 40} @i{previous capturing subpatterns} \7 @i{is always a back reference} \011 @i{is always a tab} \11 @i{might be a back reference, or another way of} @i{writing a tab} \0113 @i{is a tab followed by the character @samp{3}} \113 @i{is the character with octal code 113 (since there} @i{can be no more than 99 back references)} \377 @i{is a byte consisting entirely of 1 bits (@sc{ascii} 255)} \81 @i{is either a back reference, or a binary zero} @i{followed by the two characters @samp{81}} @end example Note that octal values of 100 or greater must not be introduced duced by a leading zero, because no more than three octal digits are ever read. All the sequences that define a single byte value can be used both inside and outside character classes. In addition, inside a character class, the sequence @code{\b} is interpreted as the backspace character (hex 08). Outside a character class it has a different meaning (see below). In addition, there are four additional escapes specifying generic character classes (like @code{\w} and @code{\W} do): @cindex Perl-style regular expressions, character classes @table @samp @item \d Matches any decimal digit @item \D Matches any character that is not a decimal digit @end table In Perl mode, these character type sequences can appear both inside and outside character classes. Instead, in @sc{posix} mode these sequences (as well as @code{\w} and @code{\W}) are treated as two literal characters (a backslash and a letter) inside square brackets. Escaped sequences specifying assertions are also different in Perl mode. An assertion specifies a condition that has to be met at a particular point in a match, without consuming any characters from the subject string. The use of subpatterns for more complicated assertions is described below. The backslashed assertions are @cindex Perl-style regular expressions, assertions @table @samp @item \b Asserts that the point is at a word boundary. A word boundary is a position in the subject string where the current character and the previous character do not both match @code{\w} or @code{\W} (i.e. one matches @code{\w} and the other matches @code{\W}), or the start or end of the string if the first or last character matches @code{\w}, respectively. @item \B Asserts that the point is not at a word boundary. @item \A Asserts the matcher is at the start of pattern space (independent of multiline mode). @item \Z Asserts the matcher is at the end of pattern space, or at a newline before the end of pattern space (independent of multiline mode) @item \z Asserts the matcher is at the end of pattern space (independent of multiline mode) @end table These assertions may not appear in character classes (but note that @code{\b} has a different meaning, namely the backspace character, inside a character class). Note that Perl mode does not support directly assertions for the beginning and the end of word; the @acronym{GNU} extensions @code{\<} and @code{\>} achieve this purpose in @sc{posix} mode instead. The @code{\A}, @code{\Z}, and @code{\z} assertions differ from the traditional circumflex and dollar sign (described below) in that they only ever match at the very start and end of the subject string, whatever options are set; in particular @code{\A} and @code{\z} are the same as the @acronym{GNU} extensions @code{\`} and @code{\'} that are active in @sc{posix} mode. @node Circumflex/dollar sign/period @appendixsec Circumflex, dollar sign, period @cindex Perl-style regular expressions, newlines Outside a character class, in the default matching mode, the circumflex character is an assertion which is true only if the current matching point is at the start of the subject string. Inside a character class, the circumflex has an entirely different meaning (see below). The circumflex need not be the first character of the pattern if a number of alternatives are involved, but it should be the first thing in each alternative in which it appears if the pattern is ever to match that branch. If all possible alternatives, start with a circumflex, that is, if the pattern is constrained to match only at the start of the subject, it is said to be an @dfn{anchored} pattern. (There are also other constructs structs that can cause a pattern to be anchored.) A dollar sign is an assertion which is true only if the current matching point is at the end of the subject string, or immediately before a newline character that is the last character in the string (by default). A dollar sign need not be the last character of the pattern if a number of alternatives are involved, but it should be the last item in any branch in which it appears. A dollar sign has no special meaning in a character class. @cindex Perl-style regular expressions, multiline The meanings of the circumflex and dollar sign characters are changed if the @code{M} modifier option is used. When this is the case, they match immediately after and immediately before an internal @code{\n} character, respectively, in addition to matching at the start and end of the subject string. For example, the pattern @code{/^abc$/} matches the subject string @samp{def\nabc} in multiline mode, but not otherwise. Consequently, patterns that are anchored in single line mode because all branches start with @code{^} are not anchored in multiline mode. @cindex Perl-style regular expressions, multiline Note that the sequences @code{\A}, @code{\Z}, and @code{\z} can be used to match the start and end of the subject in both modes, and if all branches of a pattern start with @code{\A} is it always anchored, whether the @code{M} modifier is set or not. @cindex Perl-style regular expressions, single line Outside a character class, a dot in the pattern matches any one character in the subject, including a non-printing character, but not (by default) newline. If the @code{S} modifier is used, dots match newlines as well. Actually, the handling of dot is entirely independent of the handling of circumflex and dollar sign, the only relationship being that they both involve newline characters. Dot has no special meaning in a character class. @node Square brackets @appendixsec Square brackets @cindex Perl-style regular expressions, character classes An opening square bracket introduces a character class, terminated by a closing square bracket. A closing square bracket on its own is not special. If a closing square bracket is required as a member of the class, it should be the first data character in the class (after an initial circumflex, if present) or escaped with a backslash. A character class matches a single character in the subject; the character must be in the set of characters defined by the class, unless the first character in the class is a circumflex, in which case the subject character must not be in the set defined by the class. If a circumflex is actually required as a member of the class, ensure it is not the first character, or escape it with a backslash. For example, the character class [aeiou] matches any lower case vowel, while [^aeiou] matches any character that is not a lower case vowel. Note that a circumflex is just a convenient venient notation for specifying the characters which are in the class by enumerating those that are not. It is not an assertion: it still consumes a character from the subject string, and fails if the current pointer is at the end of the string. @cindex Perl-style regular expressions, case-insensitive When caseless matching is set, any letters in a class represent both their upper case and lower case versions, so for example, a caseless @code{[aeiou]} matches uppercase and lowercase @samp{A}s, and a caseless @code{[^aeiou]} does not match @samp{A}, whereas a case-sensitive version would. @cindex Perl-style regular expressions, single line @cindex Perl-style regular expressions, multiline The newline character is never treated in any special way in character classes, whatever the setting of the @code{S} and @code{M} options (modifiers) is. A class such as @code{[^a]} will always match a newline. The minus (hyphen) character can be used to specify a range of characters in a character class. For example, @code{[d-m]} matches any letter between d and m, inclusive. If a minus character is required in a class, it must be escaped with a backslash or appear in a position where it cannot be interpreted as indicating a range, typically as the first or last character in the class. It is not possible to have the literal character @code{]} as the end character of a range. A pattern such as @code{[W-]46]} is interpreted as a class of two characters (@code{W} and @code{-}) followed by a literal string @code{46]}, so it would match @samp{W46]} or @samp{-46]}. However, if the @code{]} is escaped with a backslash it is interpreted as the end of range, so @code{[W-\]46]} is interpreted as a single class containing a range followed by two separate characters. The octal or hexadecimal representation of @code{]} can also be used to end a range. Ranges operate in @sc{ascii} collating sequence. They can also be used for characters specified numerically, for example @code{[\000-\037]}. If a range that includes letters is used when caseless matching is set, it matches the letters in either case. For example, a caseless @code{[W-c]} is equivalent to @code{[][\^_`wxyzabc]}, matched caselessly, and if character tables for the French locale are in use, @code{[\xc8-\xcb]} matches accented E characters in both cases. Unlike in @sc{posix} mode, the character types @code{\d}, @code{\D}, @code{\s}, @code{\S}, @code{\w}, and @code{\W} may also appear in a character class, and add the characters that they match to the class. For example, @code{[\dABCDEF]} matches any hexadecimal digit. A circumflex can conveniently be used with the upper case character types to specify a more restricted set of characters than the matching lower case type. For example, the class @code{[^\W_]} matches any letter or digit, but not underscore. All non-alphameric characters other than @code{\}, @code{-}, @code{^} (at the start) and the terminating @code{]} are non-special in character classes, but it does no harm if they are escaped. Perl 5.6 supports the @sc{posix} notation for character classes, which uses names enclosed by @code{[:} and @code{:]} within the enclosing square brackets, and @value{SSED} supports this notation as well. For example, @example [01[:alpha:]%] @end example @noindent matches @samp{0}, @samp{1}, any alphabetic character, or @samp{%}. The supported class names are @table @code @item alnum Matches letters and digits @item alpha Matches letters @item ascii Matches character codes 0 - 127 @item cntrl Matches control characters @item digit Matches decimal digits (same as \d) @item graph Matches printing characters, excluding space @item lower Matches lower case letters @item print Matches printing characters, including space @item punct Matches printing characters, excluding letters and digits @item space Matches white space (same as \s) @item upper Matches upper case letters @item word Matches ``word'' characters (same as \w) @item xdigit Matches hexadecimal digits @end table The names @code{ascii} and @code{word} are extensions valid only in Perl mode. Another Perl extension is negation, which is indicated by a circumflex character after the colon. For example, @example [12[:^digit:]] @end example @noindent matches @samp{1}, @samp{2}, or any non-digit. @node Options setting @appendixsec Options setting @cindex Perl-style regular expressions, toggling options @cindex Perl-style regular expressions, case-insensitive @cindex Perl-style regular expressions, multiline @cindex Perl-style regular expressions, single line @cindex Perl-style regular expressions, extended The settings of the @code{I}, @code{M}, @code{S}, @code{X} modifiers can be changed from within the pattern by a sequence of Perl option letters enclosed between @code{(?} and @code{)}. The option letters must be lowercase. For example, @code{(?im)} sets caseless, multiline matching. It is also possible to unset these options by preceding the letter with a hyphen; you can also have combined settings and unsettings: @code{(?im-sx)} sets caseless and multiline matching, while unsets single line matching (for dots) and extended whitespace interpretation. If a letter appears both before and after the hyphen, the option is unset. The scope of these option changes depends on where in the pattern the setting occurs. For settings that are outside any subpattern (defined below), the effect is the same as if the options were set or unset at the start of matching. The following patterns all behave in exactly the same way: @example (?i)abc a(?i)bc ab(?i)c abc(?i) @end example which in turn is the same as specifying the pattern abc with the @code{I} modifier. In other words, ``top level'' settings apply to the whole pattern (unless there are other changes inside subpatterns). If there is more than one setting of the same option at top level, the rightmost setting is used. If an option change occurs inside a subpattern, the effect is different. This is a change of behaviour in Perl 5.005. An option change inside a subpattern affects only that part of the subpattern @emph{that follows} it, so @example (a(?i)b)c @end example @noindent matches abc and aBc and no other strings (assuming case-sensitive matching is used). By this means, options can be made to have different settings in different parts of the pattern. Any changes made in one alternative do carry on into subsequent branches within the same subpattern. For example, @example (a(?i)b|c) @end example @noindent matches @samp{ab}, @samp{aB}, @samp{c}, and @samp{C}, even though when matching @samp{C} the first branch is abandoned before the option setting. This is because the effects of option settings happen at compile time. There would be some very weird behaviour otherwise. @ignore There are two PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA that can be changed in the same way as the Perl-compatible options by using the characters U and X respectively. The (?X) flag setting is special in that it must always occur earlier in the pattern than any of the additional features it turns on, even when it is at top level. It is best put at the start. @end ignore @node Non-capturing subpatterns @appendixsec Non-capturing subpatterns @cindex Perl-style regular expressions, non-capturing subpatterns Marking part of a pattern as a subpattern does two things. On one hand, it localizes a set of alternatives; on the other hand, it sets up the subpattern as a capturing subpattern (as defined above). The subpattern can be backreferenced and referenced in the right side of @code{s} commands. For example, if the string @samp{the red king} is matched against the pattern @example the ((red|white) (king|queen)) @end example @noindent the captured substrings are @samp{red king}, @samp{red}, and @samp{king}, and are numbered 1, 2, and 3. The fact that plain parentheses fulfil two functions is not always helpful. There are often times when a grouping subpattern is required without a capturing requirement. If an opening parenthesis is followed by @code{?:}, the subpattern does not do any capturing, and is not counted when computing the number of any subsequent capturing subpatterns. For example, if the string @samp{the white queen} is matched against the pattern @example the ((?:red|white) (king|queen)) @end example @noindent the captured substrings are @samp{white queen} and @samp{queen}, and are numbered 1 and 2. The maximum number of captured substrings is 99, while the maximum number of all subpatterns, both capturing and non-capturing, is 200. As a convenient shorthand, if any option settings are equired at the start of a non-capturing subpattern, the option letters may appear between the @code{?} and the @code{:}. Thus the two patterns @example (?i:saturday|sunday) (?:(?i)saturday|sunday) @end example @noindent match exactly the same set of strings. Because alternative branches are tried from left to right, and options are not reset until the end of the subpattern is reached, an option setting in one branch does affect subsequent branches, so the above patterns match @samp{SUNDAY} as well as @samp{Saturday}. @node Repetition @appendixsec Repetition @cindex Perl-style regular expressions, repetitions Repetition is specified by quantifiers, which can follow any of the following items: @itemize @bullet @item a single character, possibly escaped @item the @code{.} special character @item a character class @item a back reference (see next section) @item a parenthesized subpattern (unless it is an assertion; @pxref{Assertions}) @end itemize The general repetition quantifier specifies a minimum and maximum number of permitted matches, by giving the two numbers in curly brackets (braces), separated by a comma. The numbers must be less than 65536, and the first must be less than or equal to the second. For example: @example z@{2,4@} @end example @noindent matches @samp{zz}, @samp{zzz}, or @samp{zzzz}. A closing brace on its own is not a special character. If the second number is omitted, but the comma is present, there is no upper limit; if the second number and the comma are both omitted, the quantifier specifies an exact number of required matches. Thus @example [aeiou]@{3,@} @end example @noindent matches at least 3 successive vowels, but may match many more, while @example \d@{8@} @end example @noindent matches exactly 8 digits. An opening curly bracket that appears in a position where a quantifier is not allowed, or one that does not match the syntax of a quantifier, is taken as a literal character. For example, @{,6@} is not a quantifier, but a literal string of four characters.@footnote{It raises an error if @option{-R} is not used.} The quantifier @samp{@{0@}} is permitted, causing the expression to behave as if the previous item and the quantifier were not present. For convenience (and historical compatibility) the three most common quantifiers have single-character abbreviations: @table @code @item * is equivalent to @{0,@} @item + is equivalent to @{1,@} @item ? is equivalent to @{0,1@} @end table It is possible to construct infinite loops by following a subpattern that can match no characters with a quantifier that has no upper limit, for example: @example (a?)* @end example Earlier versions of Perl used to give an error at compile time for such patterns. However, because there are cases where this can be useful, such patterns are now accepted, but if any repetition of the subpattern does in fact match no characters, the loop is forcibly broken. @cindex Greedy regular expression matching @cindex Perl-style regular expressions, stingy repetitions By default, the quantifiers are @dfn{greedy} like in @sc{posix} mode, that is, they match as much as possible (up to the maximum number of permitted times), without causing the rest of the pattern to fail. The classic example of where this gives problems is in trying to match comments in C programs. These appear between the sequences @code{/*} and @code{*/} and within the sequence, individual @code{*} and @code{/} characters may appear. An attempt to match C comments by applying the pattern @example /\*.*\*/ @end example @noindent to the string @example /* first command */ not comment /* second comment */ @end example @noindent fails, because it matches the entire string owing to the greediness of the @code{.*} item. However, if a quantifier is followed by a question mark, it ceases to be greedy, and instead matches the minimum number of times possible, so the pattern @code{/\*.*?\*/} does the right thing with the C comments. The meaning of the various quantifiers is not otherwise changed, just the preferred number of matches. Do not confuse this use of question mark with its use as a quantifier in its own right. Because it has two uses, it can sometimes appear doubled, as in @example \d??\d @end example which matches one digit by preference, but can match two if that is the only way the rest of the pattern matches. Note that greediness does not matter when specifying addresses, but can be nevertheless used to improve performance. @ignore If the PCRE_UNGREEDY option is set (an option which is not available in Perl), the quantifiers are not greedy by default, but individual ones can be made greedy by following them with a question mark. In other words, it inverts the default behaviour. @end ignore When a parenthesized subpattern is quantified with a minimum repeat count that is greater than 1 or with a limited maximum, more store is required for the compiled pattern, in proportion to the size of the minimum or maximum. @cindex Perl-style regular expressions, single line If a pattern starts with @code{.*} or @code{.@{0,@}} and the @code{S} modifier is used, the pattern is implicitly anchored, because whatever follows will be tried against every character position in the subject string, so there is no point in retrying the overall match at any position after the first. PCRE treats such a pattern as though it were preceded by \A. When a capturing subpattern is repeated, the value captured is the substring that matched the final iteration. For example, after @example (tweedle[dume]@{3@}\s*)+ @end example @noindent has matched @samp{tweedledum tweedledee} the value of the captured substring is @samp{tweedledee}. However, if there are nested capturing subpatterns, the corresponding captured values may have been set in previous iterations. For example, after @example /(a|(b))+/ @end example matches @samp{aba}, the value of the second captured substring is @samp{b}. @node Backreferences @appendixsec Backreferences @cindex Perl-style regular expressions, backreferences Outside a character class, a backslash followed by a digit greater than 0 (and possibly further digits) is a back reference to a capturing subpattern earlier (i.e. to its left) in the pattern, provided there have been that many previous capturing left parentheses. However, if the decimal number following the backslash is less than 10, it is always taken as a back reference, and causes an error only if there are not that many capturing left parentheses in the entire pattern. In other words, the parentheses that are referenced need not be to the left of the reference for numbers less than 10. @ref{Backslash} for further details of the handling of digits following a backslash. A back reference matches whatever actually matched the capturing subpattern in the current subject string, rather than anything matching the subpattern itself. So the pattern @example (sens|respons)e and \1ibility @end example @noindent matches @samp{sense and sensibility} and @samp{response and responsibility}, but not @samp{sense and responsibility}. If caseful matching is in force at the time of the back reference, the case of letters is relevant. For example, @example ((?i)blah)\s+\1 @end example @noindent matches @samp{blah blah} and @samp{Blah Blah}, but not @samp{BLAH blah}, even though the original capturing subpattern is matched caselessly. There may be more than one back reference to the same subpattern. Also, if a subpattern has not actually been used in a particular match, any back references to it always fail. For example, the pattern @example (a|(bc))\2 @end example @noindent always fails if it starts to match @samp{a} rather than @samp{bc}. Because there may be up to 99 back references, all digits following the backslash are taken as part of a potential back reference number; this is different from what happens in @sc{posix} mode. If the pattern continues with a digit character, some delimiter must be used to terminate the back reference. If the @code{X} modifier option is set, this can be whitespace. Otherwise an empty comment can be used, or the following character can be expressed in hexadecimal or octal. A back reference that occurs inside the parentheses to which it refers fails when the subpattern is first used, so, for example, @code{(a\1)} never matches. However, such references can be useful inside repeated subpatterns. For example, the pattern @example (a|b\1)+ @end example @noindent matches any number of @samp{a}s and also @samp{aba}, @samp{ababbaa}, etc. At each iteration of the subpattern, the back reference matches the character string corresponding to the previous iteration. In order for this to work, the pattern must be such that the first iteration does not need to match the back reference. This can be done using alternation, as in the example above, or by a quantifier with a minimum of zero. @node Assertions @appendixsec Assertions @cindex Perl-style regular expressions, assertions @cindex Perl-style regular expressions, asserting subpatterns An assertion is a test on the characters following or preceding the current matching point that does not actually consume any characters. The simple assertions coded as @code{\b}, @code{\B}, @code{\A}, @code{\Z}, @code{\z}, @code{^} and @code{$} are described above. More complicated assertions are coded as subpatterns. There are two kinds: those that look ahead of the current position in the subject string, and those that look behind it. @cindex Perl-style regular expressions, lookahead subpatterns An assertion subpattern is matched in the normal way, except that it does not cause the current matching position to be changed. Lookahead assertions start with @code{(?=} for positive assertions and @code{(?!} for negative assertions. For example, @example \w+(?=;) @end example @noindent matches a word followed by a semicolon, but does not include the semicolon in the match, and @example foo(?!bar) @end example @noindent matches any occurrence of @samp{foo} that is not followed by @samp{bar}. Note that the apparently similar pattern @example (?!foo)bar @end example @noindent @cindex Perl-style regular expressions, lookbehind subpatterns finds any occurrence of @samp{bar} even if it is preceded by @samp{foo}, because the assertion @code{(?!foo)} is always true when the next three characters are @samp{bar}. A lookbehind assertion is needed to achieve this effect. Lookbehind assertions start with @code{(?<=} for positive assertions and @code{(?} as in this example: @example (?>\d+)bar @end example This kind of parenthesis ``locks up'' the part of the pattern it contains once it has matched, and a failure further into the pattern is prevented from backtracking into it. Backtracking past it to previous items, however, works as normal. Non-backtracking subpatterns are not capturing subpatterns. Simple cases such as the above example can be thought of as a maximizing repeat that must swallow everything it can. So, while both @code{\d+} and @code{\d+?} are prepared to adjust the number of digits they match in order to make the rest of the pattern match, @code{(?>\d+)} can only match an entire sequence of digits. This construction can of course contain arbitrarily complicated subpatterns, and it can be nested. @cindex Perl-style regular expressions, lookbehind subpatterns Non-backtracking subpatterns can be used in conjunction with look-behind assertions to specify efficient matching at the end of the subject string. Consider a simple pattern such as @example abcd$ @end example @noindent when applied to a long string which does not match. Because matching proceeds from left to right, @command{sed} will look for each @samp{a} in the subject and then see if what follows matches the rest of the pattern. If the pattern is specified as @example ^.*abcd$ @end example @noindent the initial @code{.*} matches the entire string at first, but when this fails (because there is no following @samp{a}), it backtracks to match all but the last character, then all but the last two characters, and so on. Once again the search for @samp{a} covers the entire string, from right to left, so we are no better off. However, if the pattern is written as @example ^(?>.*)(?<=abcd) @end example there can be no backtracking for the .* item; it can match only the entire string. The subsequent lookbehind assertion does a single test on the last four characters. If it fails, the match fails immediately. For long strings, this approach makes a significant difference to the processing time. When a pattern contains an unlimited repeat inside a subpattern that can itself be repeated an unlimited number of times, the use of a once-only subpattern is the only way to avoid some failing matches taking a very long time indeed.@footnote{Actually, the matcher embedded in @value{SSED} tries to do something for this in the simplest cases, like @code{([^b]*b)*}. These cases are actually quite common: they happen for example in a regular expression like @code{\/\*([^*]*\*)*\/} which matches C comments.} The pattern @example (\D+|<\d+>)*[!?] @end example ([^0-9<]+<(\d+>)?)*[!?] @noindent matches an unlimited number of substrings that either consist of non-digits, or digits enclosed in angular brackets, followed by an exclamation or question mark. When it matches, it runs quickly. However, if it is applied to @example aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @end example @noindent it takes a long time before reporting failure. This is because the string can be divided between the two repeats in a large number of ways, and all have to be tried.@footnote{The example used @code{[!?]} rather than a single character at the end, because both @value{SSED} and Perl have an optimization that allows for fast failure when a single character is used. They remember the last single character that is required for a match, and fail early if it is not present in the string.} If the pattern is changed to @example ((?>\D+)|<\d+>)*[!?] @end example sequences of non-digits cannot be broken, and failure happens quickly. @node Conditional subpatterns @appendixsec Conditional subpatterns @cindex Perl-style regular expressions, conditional subpatterns It is possible to cause the matching process to obey a subpattern conditionally or to choose between two alternative subpatterns, depending on the result of an assertion, or whether a previous capturing subpattern matched or not. The two possible forms of conditional subpattern are @example (?(@var{condition})@var{yes-pattern}) (?(@var{condition})@var{yes-pattern}|@var{no-pattern}) @end example If the condition is satisfied, the yes-pattern is used; otherwise the no-pattern (if present) is used. If there are more than two alternatives in the subpattern, a compile-time error occurs. There are two kinds of condition. If the text between the parentheses consists of a sequence of digits, the condition is satisfied if the capturing subpattern of that number has previously matched. The number must be greater than zero. Consider the following pattern, which contains non-significant white space to make it more readable (assume the @code{X} modifier) and to divide it into three parts for ease of discussion: @example ( \( )? [^()]+ (?(1) \) ) @end example The first part matches an optional opening parenthesis, and if that character is present, sets it as the first captured substring. The second part matches one or more characters that are not parentheses. The third part is a conditional subpattern that tests whether the first set of parentheses matched or not. If they did, that is, if subject started with an opening parenthesis, the condition is true, and so the yes-pattern is executed and a closing parenthesis is required. Otherwise, since no-pattern is not present, the subpattern matches nothing. In other words, this pattern matches a sequence of non-parentheses, optionally enclosed in parentheses. @cindex Perl-style regular expressions, lookahead subpatterns If the condition is not a sequence of digits, it must be an assertion. This may be a positive or negative lookahead or lookbehind assertion. Consider this pattern, again containing non-significant white space, and with the two alternatives on the second line: @example (?(?=...[a-z]) \d\d-[a-z]@{3@}-\d\d | \d\d-\d\d-\d\d ) @end example The condition is a positive lookahead assertion that matches a letter that is three characters away from the current point. If a letter is found, the subject is matched against the first alternative @samp{@var{dd}-@var{aaa}-@var{dd}} (where @var{aaa} are letters and @var{dd} are digits); otherwise it is matched against the second alternative, @samp{@var{dd}-@var{dd}-@var{dd}}. @node Recursive patterns @appendixsec Recursive patterns @cindex Perl-style regular expressions, recursive patterns @cindex Perl-style regular expressions, recursion Consider the problem of matching a string in parentheses, allowing for unlimited nested parentheses. Without the use of recursion, the best that can be done is to use a pattern that matches up to some fixed depth of nesting. It is not possible to handle an arbitrary nesting depth. Perl 5.6 has provided an experimental facility that allows regular expressions to recurse (amongst other things). It does this by interpolating Perl code in the expression at run time, and the code can refer to the expression itself. A Perl pattern tern to solve the parentheses problem can be created like this: @example $re = qr@{\( (?: (?>[^()]+) | (?p@{$re@}) )* \)@}x; @end example The @code{(?p@{...@})} item interpolates Perl code at run time, and in this case refers recursively to the pattern in which it appears. Obviously, @command{sed} cannot support the interpolation of Perl code. Instead, the special item @code{(?R)} is provided for the specific case of recursion. This pattern solves the parentheses problem (assume the @code{X} modifier option is used so that white space is ignored): @example \( ( (?>[^()]+) | (?R) )* \) @end example First it matches an opening parenthesis. Then it matches any number of substrings which can either be a sequence of non-parentheses, or a recursive match of the pattern itself (i.e. a correctly parenthesized substring). Finally there is a closing parenthesis. This particular example pattern contains nested unlimited repeats, and so the use of a non-backtracking subpattern for matching strings of non-parentheses is important when applying the pattern to strings that do not match. For example, when it is applied to @example (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() @end example it yields a ``no match'' response quickly. However, if a standard backtracking subpattern is not used, the match runs for a very long time indeed because there are so many different ways the @code{+} and @code{*} repeats can carve up the subject, and all have to be tested before failure can be reported. The values set for any capturing subpatterns are those from the outermost level of the recursion at which the subpattern value is set. If the pattern above is matched against @example (ab(cd)ef) @end example @noindent the value for the capturing parentheses is @samp{ef}, which is the last value taken on at the top level. @node Comments @appendixsec Comments @cindex Perl-style regular expressions, comments The sequence (?# marks the start of a comment which continues ues up to the next closing parenthesis. Nested parentheses are not permitted. The characters that make up a comment play no part in the pattern matching at all. @cindex Perl-style regular expressions, extended If the @code{X} modifier option is used, an unescaped @code{#} character outside a character class introduces a comment that continues up to the next newline character in the pattern. @end ifset @page @node Concept Index @unnumbered Concept Index This is a general index of all issues discussed in this manual, with the exception of the @command{sed} commands and command-line options. @printindex cp @page @node Command and Option Index @unnumbered Command and Option Index This is an alphabetical list of all @command{sed} commands and command-line options. @printindex fn @contents @bye @c XXX FIXME: the term "cycle" is never defined... sed-3.62/doc/sed.x0000644000076600007660000001510410143133571010664 00000000000000.SH NAME sed \- a Stream EDitor .SH SYNOPSIS .nf sed [-V] [--version] [--help] [-n] [--quiet] [--silent] [-l N] [--line-length=N] [-u] [--unbuffered] [-r] [--regexp-extended] [-e script] [--expression=script] [-f script-file] [--file=script-file] [script-if-no-other-script] [file...] .fi [DESCRIPTION] .ds sd \fIsed\fP .ds Sd \fISed\fP \*(Sd is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as \fIed\fP), \*(sd works by making only one pass over the input(s), and is consequently more efficient. But it is \*(sd's ability to filter text in a pipeline which particularly distinguishes it from other types of editors. [COMMAND SYNOPSIS] This is just a brief synopsis of \*(sd commands to serve as a reminder to those who already know \*(sd; other documentation (such as the texinfo document) must be consulted for fuller descriptions. .SS Zero-address ``commands'' .TP .RI :\ label Label for .B b and .B t commands. .TP .RI # comment The comment extends until the next newline (or the end of a .B -e script fragment). .TP } The closing bracket of a { } block. .SS Zero- or One- address commands .TP = Print the current line number. .TP a \e .TP .I text Append .IR text , which has each embedded newline preceded by a backslash. .TP i \e .TP .I text Insert .IR text , which has each embedded newline preceded by a backslash. .TP q Immediately quit the \*(sd script without processing any more input, except that if auto-print is not disabled the current pattern space will be printed. .TP Q Immediately quit the \*(sd script without processing any more input. .TP .RI r\ filename Append text read from .IR filename . .TP .RI R\ filename Append a line read from .IR filename . .SS Commands which accept address ranges .TP { Begin a block of commands (end with a }). .TP .RI b\ label Branch to .IR label ; if .I label is omitted, branch to end of script. .TP .RI t\ label If a s/// has done a successful substitution since the last input line was read and since the last t or T command, then branch to .IR label ; if .I label is omitted, branch to end of script. .TP .RI T\ label If no s/// has done a successful substitution since the last input line was read and since the last t or T command, then branch to .IR label ; if .I label is omitted, branch to end of script. .TP c \e .TP .I text Replace the selected lines with .IR text , which has each embedded newline preceded by a backslash. .TP d Delete pattern space. Start next cycle. .TP D Delete up to the first embedded newline in the pattern space. Start next cycle, but skip reading from the input if there is still data in the pattern space. .TP h H Copy/append pattern space to hold space. .TP g G Copy/append hold space to pattern space. .TP x Exchange the contents of the hold and pattern spaces. .TP l List out the current line in a ``visually unambiguous'' form. .TP n N Read/append the next line of input into the pattern space. .TP p Print the current pattern space. .TP P Print up to the first embedded newline of the current pattern space. .TP .RI s/ regexp / replacement / Attempt to match .I regexp against the pattern space. If successful, replace that portion matched with .IR replacement . The .I replacement may contain the special character .B & to refer to that portion of the pattern space which matched, and the special escapes \e1 through \e9 to refer to the corresponding matching sub-expressions in the .IR regexp . .TP .RI w\ filename Write the current pattern space to .IR filename . .TP .RI W\ filename Write the first line of the current pattern space to .IR filename . .TP .RI y/ source / dest / Transliterate the characters in the pattern space which appear in .I source to the corresponding character in .IR dest . .SH Addresses \*(Sd commands can be given with no addresses, in which case the command will be executed for all input lines; with one address, in which case the command will only be executed for input lines which match that address; or with two addresses, in which case the command will be executed for all input lines which match the inclusive range of lines starting from the first address and continuing to the second address. Three things to note about address ranges: the syntax is .IR addr1 , addr2 (i.e., the addresses are separated by a comma); the line which .I addr1 matched will always be accepted, even if .I addr2 selects an earlier line; and if .I addr2 is a .IR regexp , it will not be tested against the line that .I addr1 matched. .PP After the address (or address-range), and before the command, a .B ! may be inserted, which specifies that the command shall only be executed if the address (or address-range) does .B not match. .PP The following address types are supported: .TP .I number Match only the specified line .IR number . .TP .IR first ~ step Match every .IR step 'th line starting with line .IR first . For example, ``sed -n 1~2p'' will print all the odd-numbered lines in the input stream, and the address 2~5 will match every fifth line, starting with the second. (This is an extension.) .TP $ Match the last line. .TP .RI / regexp / Match lines matching the regular expression .IR regexp . .TP .BI \fR\e\fPc regexp c Match lines matching the regular expression .IR regexp . The .B c may be any character. .PP GNU \*(sd also supports some special 2-address forms: .TP .RI 0, addr2 Start out in "matched first address" state, until .I addr2 is found. This is similar to .RI 1, addr2 , except that if .I addr2 matches the very first line of input the .RI 0, addr2 form will be at the end of its range, whereas the .RI 1, addr2 form will still be at the beginning of its range. .TP .IR addr1 ,+ N Will match .I addr1 and the .I N lines following .IR addr1 . .TP .IR addr1 ,~ N Will match .I addr1 and the lines following .I addr1 until the next line whose input line number is a multiple of .IR N . [REGULAR EXPRESSIONS] POSIX.2 BREs .I should be supported, but they aren't completely because of performance problems. The .B \en sequence in a regular expression matches the newline character, and similarly for .BR \ea , .BR \et , and other sequences. [SEE ALSO] .BR awk (1), .BR ed (1), .BR grep (1), .BR tr (1), .BR perlre (1), sed.info, any of various books on \*(sd, .na the \*(sd FAQ (http://sed.sf.net/grabbag/tutorials/sedfaq.html), http://sed.sf.net/grabbag/. [BUGS] .PP E-mail bug reports to .BR bonzini@gnu.org . Be sure to include the word ``sed'' somewhere in the ``Subject:'' field. Also, please include the output of ``sed --version'' in the body of your report if at all possible. sed-3.62/doc/stamp-vti0000644000076600007660000000014310202173657011571 00000000000000@set UPDATED 26 December 2004 @set UPDATED-MONTH December 2004 @set EDITION 3.62 @set VERSION 3.62 sed-3.62/doc/version.texi0000644000076600007660000000014310202173657012302 00000000000000@set UPDATED 26 December 2004 @set UPDATED-MONTH December 2004 @set EDITION 3.62 @set VERSION 3.62 sed-3.62/intl/0000777000076600007660000000000010202633237010204 500000000000000sed-3.62/intl/ChangeLog0000644000076600007660000000010710143704202011663 000000000000002002-01-31 GNU * Version 0.11 released. sed-3.62/intl/Makefile.in0000644000076600007660000002515410143704202012167 00000000000000# Makefile for directory with message catalog handling in GNU NLS Utilities. # Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. # # This program 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, 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = .. VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ transform = @program_transform_name@ libdir = @libdir@ includedir = @includedir@ datadir = @datadir@ localedir = $(datadir)/locale gettextsrcdir = $(datadir)/gettext/intl aliaspath = $(localedir) subdir = intl INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @MKINSTALLDIRS@ mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac` l = @INTL_LIBTOOL_SUFFIX_PREFIX@ AR = ar CC = @CC@ LIBTOOL = @LIBTOOL@ RANLIB = @RANLIB@ YACC = @INTLBISON@ -y -d YFLAGS = --name-prefix=__gettext DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \ -DLIBDIR=\"$(libdir)\" -DIN_LIBINTL @DEFS@ CPPFLAGS = @CPPFLAGS@ CFLAGS = @CFLAGS@ LDFLAGS = @LDFLAGS@ COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) HEADERS = $(COMHDRS) libgnuintl.h loadinfo.h COMHDRS = gmo.h gettextP.h hash-string.h plural-exp.h eval-plural.h os2compat.h SOURCES = $(COMSRCS) intl-compat.c COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \ finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \ explodename.c dcigettext.c dcngettext.c dngettext.c ngettext.c plural.y \ plural-exp.c localcharset.c localename.c osdep.c os2compat.c OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \ finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \ explodename.$lo dcigettext.$lo dcngettext.$lo dngettext.$lo ngettext.$lo \ plural.$lo plural-exp.$lo localcharset.$lo localename.$lo osdep.$lo GETTOBJS = intl-compat.$lo DISTFILES.common = Makefile.in \ config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES) DISTFILES.generated = plural.c DISTFILES.normal = VERSION DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \ COPYING.LIB-2 gettext.h libgettext.h plural-eval.c # Libtool's library version information for libintl. # Before making a gettext release, the gettext maintainer must change this # according to the libtool documentation, section "Library interface versions". # Maintainers of other packages that include the intl directory must *not* # change these values. LTV_CURRENT=2 LTV_REVISION=0 LTV_AGE=0 .SUFFIXES: .SUFFIXES: .c .y .o .lo .sin .sed .c.o: $(COMPILE) $< .c.lo: $(LIBTOOL) --mode=compile $(COMPILE) $< .y.c: $(YACC) $(YFLAGS) --output $@ $< rm -f $*.h .sin.sed: sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@ mv t-$@ $@ INCLUDES = -I.. -I. -I$(top_srcdir)/intl all: all-@USE_INCLUDED_LIBINTL@ all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed all-no: all-no-@BUILD_INCLUDED_LIBINTL@ all-no-yes: libgnuintl.$la all-no-no: libintl.a libgnuintl.a: $(OBJECTS) rm -f $@ $(AR) cru $@ $(OBJECTS) $(RANLIB) $@ libintl.la libgnuintl.la: $(OBJECTS) $(LIBTOOL) --mode=link \ $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \ $(OBJECTS) @LTLIBICONV@ -lc \ -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \ -rpath $(libdir) \ -no-undefined libintl.h: libgnuintl.h cp $(srcdir)/libgnuintl.h libintl.h charset.alias: config.charset $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ mv t-$@ $@ check: all # This installation goal is only used in GNU gettext. Packages which # only use the library should use install instead. # We must not install the libintl.h/libintl.a files if we are on a # system which has the GNU gettext() function in its C library or in a # separate library. # If you want to use the one which comes with this version of the # package, you have to use `configure --with-included-gettext'. install: install-exec install-data install-exec: all if test "$(PACKAGE)" = "gettext" \ && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \ $(LIBTOOL) --mode=install \ $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \ else \ : ; \ fi if test '@USE_INCLUDED_LIBINTL@' = yes; then \ test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ temp=$(DESTDIR)$(libdir)/t-charset.alias; \ dest=$(DESTDIR)$(libdir)/charset.alias; \ if test -f $(DESTDIR)$(libdir)/charset.alias; then \ orig=$(DESTDIR)$(libdir)/charset.alias; \ sed -f ref-add.sed $$orig > $$temp; \ $(INSTALL_DATA) $$temp $$dest; \ rm -f $$temp; \ else \ if test @GLIBC21@ = no; then \ orig=charset.alias; \ sed -f ref-add.sed $$orig > $$temp; \ $(INSTALL_DATA) $$temp $$dest; \ rm -f $$temp; \ fi; \ fi; \ $(mkinstalldirs) $(DESTDIR)$(localedir); \ test -f $(DESTDIR)$(localedir)/locale.alias \ && orig=$(DESTDIR)$(localedir)/locale.alias \ || orig=$(srcdir)/locale.alias; \ temp=$(DESTDIR)$(localedir)/t-locale.alias; \ dest=$(DESTDIR)$(localedir)/locale.alias; \ sed -f ref-add.sed $$orig > $$temp; \ $(INSTALL_DATA) $$temp $$dest; \ rm -f $$temp; \ else \ : ; \ fi install-data: all if test "$(PACKAGE)" = "gettext"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \ $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \ dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \ for file in $$dists; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \ dists="$(DISTFILES.generated)"; \ for file in $$dists; do \ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ $(INSTALL_DATA) $$dir/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ dists="$(DISTFILES.obsolete)"; \ for file in $$dists; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-strip: install installdirs: if test "$(PACKAGE)" = "gettext" \ && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ else \ : ; \ fi if test '@USE_INCLUDED_LIBINTL@' = yes; then \ test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ $(mkinstalldirs) $(DESTDIR)$(localedir); \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi # Define this as empty until I found a useful application. installcheck: uninstall: if test "$(PACKAGE)" = "gettext" \ && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ rm -f $(DESTDIR)$(includedir)/libintl.h; \ $(LIBTOOL) --mode=uninstall \ rm -f $(DESTDIR)$(libdir)/libintl.$la; \ else \ : ; \ fi if test '@USE_INCLUDED_LIBINTL@' = yes; then \ if test -f $(DESTDIR)$(libdir)/charset.alias; then \ temp=$(DESTDIR)$(libdir)/t-charset.alias; \ dest=$(DESTDIR)$(libdir)/charset.alias; \ sed -f ref-del.sed $$dest > $$temp; \ if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ rm -f $$dest; \ else \ $(INSTALL_DATA) $$temp $$dest; \ fi; \ rm -f $$temp; \ fi; \ if test -f $(DESTDIR)$(localedir)/locale.alias; then \ temp=$(DESTDIR)$(localedir)/t-locale.alias; \ dest=$(DESTDIR)$(localedir)/locale.alias; \ sed -f ref-del.sed $$dest > $$temp; \ if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ rm -f $$dest; \ else \ $(INSTALL_DATA) $$temp $$dest; \ fi; \ rm -f $$temp; \ fi; \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext"; then \ for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi info dvi: $(OBJECTS): ../config.h libgnuintl.h bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: gettextP.h gmo.h loadinfo.h dcigettext.$lo: hash-string.h explodename.$lo l10nflist.$lo: loadinfo.h dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: plural-exp.h dcigettext.$lo: eval-plural.h tags: TAGS TAGS: $(HEADERS) $(SOURCES) here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) id: ID ID: $(HEADERS) $(SOURCES) here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) mostlyclean: rm -f *.a *.la *.o *.lo core core.* rm -f libintl.h charset.alias ref-add.sed ref-del.sed rm -f -r .libs _libs clean: mostlyclean distclean: clean rm -f Makefile ID TAGS if test "$(PACKAGE)" = gettext; then \ rm -f ChangeLog.inst $(DISTFILES.normal); \ else \ : ; \ fi maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." # GNU gettext needs not contain the file `VERSION' but contains some # other files which should not be distributed in other packages. distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: Makefile if test "$(PACKAGE)" = gettext; then \ additional="$(DISTFILES.gettext)"; \ else \ additional="$(DISTFILES.normal)"; \ fi; \ $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ cp -p $$dir/$$file $(distdir); \ done Makefile: Makefile.in ../config.status cd .. \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: sed-3.62/intl/VERSION0000644000076600007660000000004610143704202011163 00000000000000GNU gettext library from gettext-0.11 sed-3.62/intl/bindtextdom.c0000644000076600007660000002316310143704202012605 00000000000000/* Implementation of the bindtextdomain(3) function Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include "gettextP.h" #ifdef _LIBC /* We have to handle multi-threaded applications. */ # include #else /* Provide dummy implementation if this is outside glibc. */ # define __libc_rwlock_define(CLASS, NAME) # define __libc_rwlock_wrlock(NAME) # define __libc_rwlock_unlock(NAME) #endif /* The internal variables in the standalone libintl.a must have different names than the internal variables in GNU libc, otherwise programs using libintl.a cannot be linked statically. */ #if !defined _LIBC # define _nl_default_dirname _nl_default_dirname__ # define _nl_domain_bindings _nl_domain_bindings__ #endif /* Some compilers, like SunOS4 cc, don't have offsetof in . */ #ifndef offsetof # define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) #endif /* @@ end of prolog @@ */ /* Contains the default location of the message catalogs. */ extern const char _nl_default_dirname[]; /* List with bindings of specific domains. */ extern struct binding *_nl_domain_bindings; /* Lock variable to protect the global data in the gettext implementation. */ __libc_rwlock_define (extern, _nl_state_lock) /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define BINDTEXTDOMAIN __bindtextdomain # define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset # ifndef strdup # define strdup(str) __strdup (str) # endif #else # define BINDTEXTDOMAIN bindtextdomain__ # define BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset__ #endif /* Prototypes for local functions. */ static void set_binding_values PARAMS ((const char *domainname, const char **dirnamep, const char **codesetp)); /* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP to be used for the DOMAINNAME message catalog. If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not modified, only the current value is returned. If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither modified nor returned. */ static void set_binding_values (domainname, dirnamep, codesetp) const char *domainname; const char **dirnamep; const char **codesetp; { struct binding *binding; int modified; /* Some sanity checks. */ if (domainname == NULL || domainname[0] == '\0') { if (dirnamep) *dirnamep = NULL; if (codesetp) *codesetp = NULL; return; } __libc_rwlock_wrlock (_nl_state_lock); modified = 0; for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) { int compare = strcmp (domainname, binding->domainname); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It is not in the list. */ binding = NULL; break; } } if (binding != NULL) { if (dirnamep) { const char *dirname = *dirnamep; if (dirname == NULL) /* The current binding has be to returned. */ *dirnamep = binding->dirname; else { /* The domain is already bound. If the new value and the old one are equal we simply do nothing. Otherwise replace the old binding. */ char *result = binding->dirname; if (strcmp (dirname, result) != 0) { if (strcmp (dirname, _nl_default_dirname) == 0) result = (char *) _nl_default_dirname; else { #if defined _LIBC || defined HAVE_STRDUP result = strdup (dirname); #else size_t len = strlen (dirname) + 1; result = (char *) malloc (len); if (__builtin_expect (result != NULL, 1)) memcpy (result, dirname, len); #endif } if (__builtin_expect (result != NULL, 1)) { if (binding->dirname != _nl_default_dirname) free (binding->dirname); binding->dirname = result; modified = 1; } } *dirnamep = result; } } if (codesetp) { const char *codeset = *codesetp; if (codeset == NULL) /* The current binding has be to returned. */ *codesetp = binding->codeset; else { /* The domain is already bound. If the new value and the old one are equal we simply do nothing. Otherwise replace the old binding. */ char *result = binding->codeset; if (result == NULL || strcmp (codeset, result) != 0) { #if defined _LIBC || defined HAVE_STRDUP result = strdup (codeset); #else size_t len = strlen (codeset) + 1; result = (char *) malloc (len); if (__builtin_expect (result != NULL, 1)) memcpy (result, codeset, len); #endif if (__builtin_expect (result != NULL, 1)) { if (binding->codeset != NULL) free (binding->codeset); binding->codeset = result; binding->codeset_cntr++; modified = 1; } } *codesetp = result; } } } else if ((dirnamep == NULL || *dirnamep == NULL) && (codesetp == NULL || *codesetp == NULL)) { /* Simply return the default values. */ if (dirnamep) *dirnamep = _nl_default_dirname; if (codesetp) *codesetp = NULL; } else { /* We have to create a new binding. */ size_t len = strlen (domainname) + 1; struct binding *new_binding = (struct binding *) malloc (offsetof (struct binding, domainname) + len); if (__builtin_expect (new_binding == NULL, 0)) goto failed; memcpy (new_binding->domainname, domainname, len); if (dirnamep) { const char *dirname = *dirnamep; if (dirname == NULL) /* The default value. */ dirname = _nl_default_dirname; else { if (strcmp (dirname, _nl_default_dirname) == 0) dirname = _nl_default_dirname; else { char *result; #if defined _LIBC || defined HAVE_STRDUP result = strdup (dirname); if (__builtin_expect (result == NULL, 0)) goto failed_dirname; #else size_t len = strlen (dirname) + 1; result = (char *) malloc (len); if (__builtin_expect (result == NULL, 0)) goto failed_dirname; memcpy (result, dirname, len); #endif dirname = result; } } *dirnamep = dirname; new_binding->dirname = (char *) dirname; } else /* The default value. */ new_binding->dirname = (char *) _nl_default_dirname; new_binding->codeset_cntr = 0; if (codesetp) { const char *codeset = *codesetp; if (codeset != NULL) { char *result; #if defined _LIBC || defined HAVE_STRDUP result = strdup (codeset); if (__builtin_expect (result == NULL, 0)) goto failed_codeset; #else size_t len = strlen (codeset) + 1; result = (char *) malloc (len); if (__builtin_expect (result == NULL, 0)) goto failed_codeset; memcpy (result, codeset, len); #endif codeset = result; new_binding->codeset_cntr++; } *codesetp = codeset; new_binding->codeset = (char *) codeset; } else new_binding->codeset = NULL; /* Now enqueue it. */ if (_nl_domain_bindings == NULL || strcmp (domainname, _nl_domain_bindings->domainname) < 0) { new_binding->next = _nl_domain_bindings; _nl_domain_bindings = new_binding; } else { binding = _nl_domain_bindings; while (binding->next != NULL && strcmp (domainname, binding->next->domainname) > 0) binding = binding->next; new_binding->next = binding->next; binding->next = new_binding; } modified = 1; /* Here we deal with memory allocation failures. */ if (0) { failed_codeset: if (new_binding->dirname != _nl_default_dirname) free (new_binding->dirname); failed_dirname: free (new_binding); failed: if (dirnamep) *dirnamep = NULL; if (codesetp) *codesetp = NULL; } } /* If we modified any binding, we flush the caches. */ if (modified) ++_nl_msg_cat_cntr; __libc_rwlock_unlock (_nl_state_lock); } /* Specify that the DOMAINNAME message catalog will be found in DIRNAME rather than in the system locale data base. */ char * BINDTEXTDOMAIN (domainname, dirname) const char *domainname; const char *dirname; { set_binding_values (domainname, &dirname, NULL); return (char *) dirname; } /* Specify the character encoding in which the messages from the DOMAINNAME message catalog will be returned. */ char * BIND_TEXTDOMAIN_CODESET (domainname, codeset) const char *domainname; const char *codeset; { set_binding_values (domainname, NULL, &codeset); return (char *) codeset; } #ifdef _LIBC /* Aliases for function names in GNU C Library. */ weak_alias (__bindtextdomain, bindtextdomain); weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset); #endif sed-3.62/intl/config.charset0000755000076600007660000003217410143704202012745 00000000000000#! /bin/sh # Output a system dependent table of character encoding aliases. # # Copyright (C) 2000-2002 Free Software Foundation, Inc. # # This program 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, 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # # The table consists of lines of the form # ALIAS CANONICAL # # ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". # ALIAS is compared in a case sensitive way. # # CANONICAL is the GNU canonical name for this character encoding. # It must be an encoding supported by libiconv. Support by GNU libc is # also desirable. CANONICAL is case insensitive. Usually an upper case # MIME charset name is preferred. # The current list of GNU canonical charset names is as follows. # # name used by which systems a MIME name? # ASCII, ANSI_X3.4-1968 glibc solaris freebsd # ISO-8859-1 glibc aix hpux irix osf solaris freebsd yes # ISO-8859-2 glibc aix hpux irix osf solaris freebsd yes # ISO-8859-3 glibc yes # ISO-8859-4 osf solaris freebsd yes # ISO-8859-5 glibc aix hpux irix osf solaris freebsd yes # ISO-8859-6 glibc aix hpux solaris yes # ISO-8859-7 glibc aix hpux irix osf solaris yes # ISO-8859-8 glibc aix hpux osf solaris yes # ISO-8859-9 glibc aix hpux irix osf solaris yes # ISO-8859-13 glibc # ISO-8859-15 glibc aix osf solaris freebsd # KOI8-R glibc solaris freebsd yes # KOI8-U glibc freebsd yes # CP437 dos # CP775 dos # CP850 aix osf dos # CP852 dos # CP855 dos # CP856 aix # CP857 dos # CP861 dos # CP862 dos # CP864 dos # CP865 dos # CP866 freebsd dos # CP869 dos # CP874 win32 dos # CP922 aix # CP932 aix win32 dos # CP943 aix # CP949 osf win32 dos # CP950 win32 dos # CP1046 aix # CP1124 aix # CP1129 aix # CP1250 win32 # CP1251 glibc win32 # CP1252 aix win32 # CP1253 win32 # CP1254 win32 # CP1255 win32 # CP1256 win32 # CP1257 win32 # GB2312 glibc aix hpux irix solaris freebsd yes # EUC-JP glibc aix hpux irix osf solaris freebsd yes # EUC-KR glibc aix hpux irix osf solaris freebsd yes # EUC-TW glibc aix hpux irix osf solaris # BIG5 glibc aix hpux osf solaris freebsd yes # BIG5-HKSCS glibc # GBK aix osf win32 dos # GB18030 glibc # SHIFT_JIS hpux osf solaris freebsd yes # JOHAB glibc win32 # TIS-620 glibc aix hpux osf solaris # VISCII glibc yes # HP-ROMAN8 hpux # HP-ARABIC8 hpux # HP-GREEK8 hpux # HP-HEBREW8 hpux # HP-TURKISH8 hpux # HP-KANA8 hpux # DEC-KANJI osf # DEC-HANYU osf # UTF-8 glibc aix hpux osf solaris yes # # Note: Names which are not marked as being a MIME name should not be used in # Internet protocols for information interchange (mail, news, etc.). # # Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications # must understand both names and treat them as equivalent. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM host="$1" os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` echo "# This file contains a table of character encoding aliases," echo "# suitable for operating system '${os}'." echo "# It was automatically generated from config.charset." # List of references, updated during installation: echo "# Packages using this file: " case "$os" in linux* | *-gnu*) # With glibc-2.1 or newer, we don't need any canonicalization, # because glibc has iconv and both glibc and libiconv support all # GNU canonical names directly. Therefore, the Makefile does not # need to install the alias file at all. # The following applies only to glibc-2.0.x and older libcs. echo "ISO_646.IRV:1983 ASCII" ;; aix*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-6 ISO-8859-6" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "IBM-850 CP850" echo "IBM-856 CP856" echo "IBM-921 ISO-8859-13" echo "IBM-922 CP922" echo "IBM-932 CP932" echo "IBM-943 CP943" echo "IBM-1046 CP1046" echo "IBM-1124 CP1124" echo "IBM-1129 CP1129" echo "IBM-1252 CP1252" echo "IBM-eucCN GB2312" echo "IBM-eucJP EUC-JP" echo "IBM-eucKR EUC-KR" echo "IBM-eucTW EUC-TW" echo "big5 BIG5" echo "GBK GBK" echo "TIS-620 TIS-620" echo "UTF-8 UTF-8" ;; hpux*) echo "iso88591 ISO-8859-1" echo "iso88592 ISO-8859-2" echo "iso88595 ISO-8859-5" echo "iso88596 ISO-8859-6" echo "iso88597 ISO-8859-7" echo "iso88598 ISO-8859-8" echo "iso88599 ISO-8859-9" echo "iso885915 ISO-8859-15" echo "roman8 HP-ROMAN8" echo "arabic8 HP-ARABIC8" echo "greek8 HP-GREEK8" echo "hebrew8 HP-HEBREW8" echo "turkish8 HP-TURKISH8" echo "kana8 HP-KANA8" echo "tis620 TIS-620" echo "big5 BIG5" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "hp15CN GB2312" #echo "ccdc ?" # what is this? echo "SJIS SHIFT_JIS" echo "utf8 UTF-8" ;; irix*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-9 ISO-8859-9" echo "eucCN GB2312" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" ;; osf*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "cp850 CP850" echo "big5 BIG5" echo "dechanyu DEC-HANYU" echo "dechanzi GB2312" echo "deckanji DEC-KANJI" echo "deckorean EUC-KR" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "GBK GBK" echo "KSC5601 CP949" echo "sdeckanji EUC-JP" echo "SJIS SHIFT_JIS" echo "TACTIS TIS-620" echo "UTF-8 UTF-8" ;; solaris*) echo "646 ASCII" echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-6 ISO-8859-6" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "koi8-r KOI8-R" echo "BIG5 BIG5" echo "gb2312 GB2312" echo "cns11643 EUC-TW" echo "5601 EUC-KR" echo "eucJP EUC-JP" echo "PCK SHIFT_JIS" echo "TIS620.2533 TIS-620" #echo "sun_eu_greek ?" # what is this? echo "UTF-8 UTF-8" ;; freebsd* | os2*) # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just # reuse FreeBSD's locale data for OS/2. echo "C ASCII" echo "US-ASCII ASCII" for l in la_LN lt_LN; do echo "$l.ASCII ASCII" done for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do echo "$l.ISO_8859-1 ISO-8859-1" echo "$l.DIS_8859-15 ISO-8859-15" done for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do echo "$l.ISO_8859-2 ISO-8859-2" done for l in la_LN lt_LT; do echo "$l.ISO_8859-4 ISO-8859-4" done for l in ru_RU ru_SU; do echo "$l.KOI8-R KOI8-R" echo "$l.ISO_8859-5 ISO-8859-5" echo "$l.CP866 CP866" done echo "uk_UA.KOI8-U KOI8-U" echo "zh_TW.BIG5 BIG5" echo "zh_TW.Big5 BIG5" echo "zh_CN.EUC GB2312" echo "ja_JP.EUC EUC-JP" echo "ja_JP.SJIS SHIFT_JIS" echo "ja_JP.Shift_JIS SHIFT_JIS" echo "ko_KR.EUC EUC-KR" ;; beos*) # BeOS has a single locale, and it has UTF-8 encoding. echo "* UTF-8" ;; msdosdjgpp*) # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. echo "#" echo "# The encodings given here may not all be correct." echo "# If you find that the encoding given for your language and" echo "# country is not the one your DOS machine actually uses, just" echo "# correct it in this file, and send a mail to" echo "# Juan Manuel Guerrero " echo "# and Bruno Haible ." echo "#" echo "C ASCII" # ISO-8859-1 languages echo "ca CP850" echo "ca_ES CP850" echo "da CP865" # not CP850 ?? echo "da_DK CP865" # not CP850 ?? echo "de CP850" echo "de_AT CP850" echo "de_CH CP850" echo "de_DE CP850" echo "en CP850" echo "en_AU CP850" # not CP437 ?? echo "en_CA CP850" echo "en_GB CP850" echo "en_NZ CP437" echo "en_US CP437" echo "en_ZA CP850" # not CP437 ?? echo "es CP850" echo "es_AR CP850" echo "es_BO CP850" echo "es_CL CP850" echo "es_CO CP850" echo "es_CR CP850" echo "es_CU CP850" echo "es_DO CP850" echo "es_EC CP850" echo "es_ES CP850" echo "es_GT CP850" echo "es_HN CP850" echo "es_MX CP850" echo "es_NI CP850" echo "es_PA CP850" echo "es_PY CP850" echo "es_PE CP850" echo "es_SV CP850" echo "es_UY CP850" echo "es_VE CP850" echo "et CP850" echo "et_EE CP850" echo "eu CP850" echo "eu_ES CP850" echo "fi CP850" echo "fi_FI CP850" echo "fr CP850" echo "fr_BE CP850" echo "fr_CA CP850" echo "fr_CH CP850" echo "fr_FR CP850" echo "ga CP850" echo "ga_IE CP850" echo "gd CP850" echo "gd_GB CP850" echo "gl CP850" echo "gl_ES CP850" echo "id CP850" # not CP437 ?? echo "id_ID CP850" # not CP437 ?? echo "is CP861" # not CP850 ?? echo "is_IS CP861" # not CP850 ?? echo "it CP850" echo "it_CH CP850" echo "it_IT CP850" echo "lt CP775" echo "lt_LT CP775" echo "lv CP775" echo "lv_LV CP775" echo "nb CP865" # not CP850 ?? echo "nb_NO CP865" # not CP850 ?? echo "nl CP850" echo "nl_BE CP850" echo "nl_NL CP850" echo "nn CP865" # not CP850 ?? echo "nn_NO CP865" # not CP850 ?? echo "no CP865" # not CP850 ?? echo "no_NO CP865" # not CP850 ?? echo "pt CP850" echo "pt_BR CP850" echo "pt_PT CP850" echo "sv CP850" echo "sv_SE CP850" # ISO-8859-2 languages echo "cs CP852" echo "cs_CZ CP852" echo "hr CP852" echo "hr_HR CP852" echo "hu CP852" echo "hu_HU CP852" echo "pl CP852" echo "pl_PL CP852" echo "ro CP852" echo "ro_RO CP852" echo "sk CP852" echo "sk_SK CP852" echo "sl CP852" echo "sl_SI CP852" echo "sq CP852" echo "sq_AL CP852" echo "sr CP852" # CP852 or CP866 or CP855 ?? echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? # ISO-8859-3 languages echo "mt CP850" echo "mt_MT CP850" # ISO-8859-5 languages echo "be CP866" echo "be_BE CP866" echo "bg CP866" # not CP855 ?? echo "bg_BG CP866" # not CP855 ?? echo "mk CP866" # not CP855 ?? echo "mk_MK CP866" # not CP855 ?? echo "ru KOI8-R" # not CP866 ?? echo "ru_RU KOI8-R" # not CP866 ?? # ISO-8859-6 languages echo "ar CP864" echo "ar_AE CP864" echo "ar_DZ CP864" echo "ar_EG CP864" echo "ar_IQ CP864" echo "ar_IR CP864" echo "ar_JO CP864" echo "ar_KW CP864" echo "ar_MA CP864" echo "ar_OM CP864" echo "ar_QA CP864" echo "ar_SA CP864" echo "ar_SY CP864" # ISO-8859-7 languages echo "el CP869" echo "el_GR CP869" # ISO-8859-8 languages echo "he CP862" echo "he_IL CP862" # ISO-8859-9 languages echo "tr CP857" echo "tr_TR CP857" # Japanese echo "ja CP932" echo "ja_JP CP932" # Chinese echo "zh_CN GBK" echo "zh_TW CP950" # not CP938 ?? # Korean echo "kr CP949" # not CP934 ?? echo "kr_KR CP949" # not CP934 ?? # Thai echo "th CP874" echo "th_TH CP874" # Other echo "eo CP850" echo "eo_EO CP850" ;; esac sed-3.62/intl/dcgettext.c0000644000076600007660000000343210143704202012254 00000000000000/* Implementation of the dcgettext(3) function. Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DCGETTEXT __dcgettext # define DCIGETTEXT __dcigettext #else # define DCGETTEXT dcgettext__ # define DCIGETTEXT dcigettext__ #endif /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ char * DCGETTEXT (domainname, msgid, category) const char *domainname; const char *msgid; int category; { return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dcgettext, dcgettext); #endif sed-3.62/intl/dcigettext.c0000644000076600007660000007632710143704202012442 00000000000000/* Implementation of the internal dcigettext function. Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's to provide a prototype for mempcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #ifdef __GNUC__ # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif #endif #include #ifndef errno extern int errno; #endif #ifndef __set_errno # define __set_errno(val) errno = (val) #endif #include #include #include #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #include #if defined HAVE_SYS_PARAM_H || defined _LIBC # include #endif #include "gettextP.h" #include "plural-exp.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include "hash-string.h" /* Thread safetyness. */ #ifdef _LIBC # include #else /* Provide dummy implementation if this is outside glibc. */ # define __libc_lock_define_initialized(CLASS, NAME) # define __libc_lock_lock(NAME) # define __libc_lock_unlock(NAME) # define __libc_rwlock_define_initialized(CLASS, NAME) # define __libc_rwlock_rdlock(NAME) # define __libc_rwlock_unlock(NAME) #endif /* Alignment of types. */ #if defined __GNUC__ && __GNUC__ >= 2 # define alignof(TYPE) __alignof__ (TYPE) #else # define alignof(TYPE) \ ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2) #endif /* The internal variables in the standalone libintl.a must have different names than the internal variables in GNU libc, otherwise programs using libintl.a cannot be linked statically. */ #if !defined _LIBC # define _nl_default_default_domain _nl_default_default_domain__ # define _nl_current_default_domain _nl_current_default_domain__ # define _nl_default_dirname _nl_default_dirname__ # define _nl_domain_bindings _nl_domain_bindings__ #endif /* Some compilers, like SunOS4 cc, don't have offsetof in . */ #ifndef offsetof # define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # define getcwd __getcwd # ifndef stpcpy # define stpcpy __stpcpy # endif # define tfind __tfind #else # if !defined HAVE_GETCWD char *getwd (); # define getcwd(buf, max) getwd (buf) # else char *getcwd (); # endif # ifndef HAVE_STPCPY static char *stpcpy PARAMS ((char *dest, const char *src)); # endif # ifndef HAVE_MEMPCPY static void *mempcpy PARAMS ((void *dest, const void *src, size_t n)); # endif #endif /* Amount to increase buffer size by in each try. */ #define PATH_INCR 32 /* The following is from pathmax.h. */ /* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define PATH_MAX but might cause redefinition warnings when sys/param.h is later included (as on MORE/BSD 4.3). */ #if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__) # include #endif #ifndef _POSIX_PATH_MAX # define _POSIX_PATH_MAX 255 #endif #if !defined PATH_MAX && defined _PC_PATH_MAX # define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) #endif /* Don't include sys/param.h if it already has been. */ #if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN # include #endif #if !defined PATH_MAX && defined MAXPATHLEN # define PATH_MAX MAXPATHLEN #endif #ifndef PATH_MAX # define PATH_MAX _POSIX_PATH_MAX #endif /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, it may be concatenated to a directory pathname. IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. */ #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) # define IS_PATH_WITH_DIR(P) \ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) # define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) #endif /* This is the type used for the search tree where known translations are stored. */ struct known_translation_t { /* Domain in which to search. */ char *domainname; /* The category. */ int category; /* State of the catalog counter at the point the string was found. */ int counter; /* Catalog where the string was found. */ struct loaded_l10nfile *domain; /* And finally the translation. */ const char *translation; size_t translation_length; /* Pointer to the string in question. */ char msgid[ZERO]; }; /* Root of the search tree with known translations. We can use this only if the system provides the `tsearch' function family. */ #if defined HAVE_TSEARCH || defined _LIBC # include static void *root; # ifdef _LIBC # define tsearch __tsearch # endif /* Function to compare two entries in the table of known translations. */ static int transcmp PARAMS ((const void *p1, const void *p2)); static int transcmp (p1, p2) const void *p1; const void *p2; { const struct known_translation_t *s1; const struct known_translation_t *s2; int result; s1 = (const struct known_translation_t *) p1; s2 = (const struct known_translation_t *) p2; result = strcmp (s1->msgid, s2->msgid); if (result == 0) { result = strcmp (s1->domainname, s2->domainname); if (result == 0) /* We compare the category last (though this is the cheapest operation) since it is hopefully always the same (namely LC_MESSAGES). */ result = s1->category - s2->category; } return result; } #endif /* Name of the default domain used for gettext(3) prior any call to textdomain(3). The default value for this is "messages". */ const char _nl_default_default_domain[] = "messages"; /* Value used as the default domain for gettext(3). */ const char *_nl_current_default_domain = _nl_default_default_domain; /* Contains the default location of the message catalogs. */ #if defined __EMX__ extern const char _nl_default_dirname[]; #else const char _nl_default_dirname[] = LOCALEDIR; #endif /* List with bindings of specific domains created by bindtextdomain() calls. */ struct binding *_nl_domain_bindings; /* Prototypes for local functions. */ static char *plural_lookup PARAMS ((struct loaded_l10nfile *domain, unsigned long int n, const char *translation, size_t translation_len)) internal_function; static const char *category_to_name PARAMS ((int category)) internal_function; static const char *guess_category_value PARAMS ((int category, const char *categoryname)) internal_function; /* For those loosing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA /* Nothing has to be done. */ # define ADD_BLOCK(list, address) /* nothing */ # define FREE_BLOCKS(list) /* nothing */ #else struct block_list { void *address; struct block_list *next; }; # define ADD_BLOCK(list, addr) \ do { \ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ /* If we cannot get a free block we cannot add the new element to \ the list. */ \ if (newp != NULL) { \ newp->address = (addr); \ newp->next = (list); \ (list) = newp; \ } \ } while (0) # define FREE_BLOCKS(list) \ do { \ while (list != NULL) { \ struct block_list *old = list; \ list = list->next; \ free (old); \ } \ } while (0) # undef alloca # define alloca(size) (malloc (size)) #endif /* have alloca */ #ifdef _LIBC /* List of blocks allocated for translations. */ typedef struct transmem_list { struct transmem_list *next; char data[ZERO]; } transmem_block_t; static struct transmem_list *transmem_list; #else typedef unsigned char transmem_block_t; #endif /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DCIGETTEXT __dcigettext #else # define DCIGETTEXT dcigettext__ #endif /* Lock variable to protect the global data in the gettext implementation. */ #ifdef _LIBC __libc_rwlock_define_initialized (, _nl_state_lock) #endif /* Checking whether the binaries runs SUID must be done and glibc provides easier methods therefore we make a difference here. */ #ifdef _LIBC # define ENABLE_SECURE __libc_enable_secure # define DETERMINE_SECURE #else # ifndef HAVE_GETUID # define getuid() 0 # endif # ifndef HAVE_GETGID # define getgid() 0 # endif # ifndef HAVE_GETEUID # define geteuid() getuid() # endif # ifndef HAVE_GETEGID # define getegid() getgid() # endif static int enable_secure; # define ENABLE_SECURE (enable_secure == 1) # define DETERMINE_SECURE \ if (enable_secure == 0) \ { \ if (getuid () != geteuid () || getgid () != getegid ()) \ enable_secure = 1; \ else \ enable_secure = -1; \ } #endif /* Get the function to evaluate the plural expression. */ #include "eval-plural.h" /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale and, if PLURAL is nonzero, search over string depending on the plural form determined by N. */ char * DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category) const char *domainname; const char *msgid1; const char *msgid2; int plural; unsigned long int n; int category; { #ifndef HAVE_ALLOCA struct block_list *block_list = NULL; #endif struct loaded_l10nfile *domain; struct binding *binding; const char *categoryname; const char *categoryvalue; char *dirname, *xdomainname; char *single_locale; char *retval; size_t retlen; int saved_errno; #if defined HAVE_TSEARCH || defined _LIBC struct known_translation_t *search; struct known_translation_t **foundp = NULL; size_t msgid_len; #endif size_t domainname_len; /* If no real MSGID is given return NULL. */ if (msgid1 == NULL) return NULL; __libc_rwlock_rdlock (_nl_state_lock); /* If DOMAINNAME is NULL, we are interested in the default domain. If CATEGORY is not LC_MESSAGES this might not make much sense but the definition left this undefined. */ if (domainname == NULL) domainname = _nl_current_default_domain; /* OS/2 specific: backward compatibility with older libintl versions */ #ifdef LC_MESSAGES_COMPAT if (category == LC_MESSAGES_COMPAT) category = LC_MESSAGES; #endif #if defined HAVE_TSEARCH || defined _LIBC msgid_len = strlen (msgid1) + 1; /* Try to find the translation among those which we found at some time. */ search = (struct known_translation_t *) alloca (offsetof (struct known_translation_t, msgid) + msgid_len); memcpy (search->msgid, msgid1, msgid_len); search->domainname = (char *) domainname; search->category = category; foundp = (struct known_translation_t **) tfind (search, &root, transcmp); if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr) { /* Now deal with plural. */ if (plural) retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation, (*foundp)->translation_length); else retval = (char *) (*foundp)->translation; __libc_rwlock_unlock (_nl_state_lock); return retval; } #endif /* Preserve the `errno' value. */ saved_errno = errno; /* See whether this is a SUID binary or not. */ DETERMINE_SECURE; /* First find matching binding. */ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) { int compare = strcmp (domainname, binding->domainname); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It is not in the list. */ binding = NULL; break; } } if (binding == NULL) dirname = (char *) _nl_default_dirname; else if (IS_ABSOLUTE_PATH (binding->dirname)) dirname = binding->dirname; else { /* We have a relative path. Make it absolute now. */ size_t dirname_len = strlen (binding->dirname) + 1; size_t path_max; char *ret; path_max = (unsigned int) PATH_MAX; path_max += 2; /* The getcwd docs say to do this. */ for (;;) { dirname = (char *) alloca (path_max + dirname_len); ADD_BLOCK (block_list, dirname); __set_errno (0); ret = getcwd (dirname, path_max); if (ret != NULL || errno != ERANGE) break; path_max += path_max / 2; path_max += PATH_INCR; } if (ret == NULL) { /* We cannot get the current working directory. Don't signal an error but simply return the default string. */ FREE_BLOCKS (block_list); __libc_rwlock_unlock (_nl_state_lock); __set_errno (saved_errno); return (plural == 0 ? (char *) msgid1 /* Use the Germanic plural rule. */ : n == 1 ? (char *) msgid1 : (char *) msgid2); } stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); } /* Now determine the symbolic name of CATEGORY and its value. */ categoryname = category_to_name (category); categoryvalue = guess_category_value (category, categoryname); domainname_len = strlen (domainname); xdomainname = (char *) alloca (strlen (categoryname) + domainname_len + 5); ADD_BLOCK (block_list, xdomainname); stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), domainname, domainname_len), ".mo"); /* Creating working area. */ single_locale = (char *) alloca (strlen (categoryvalue) + 1); ADD_BLOCK (block_list, single_locale); /* Search for the given string. This is a loop because we perhaps got an ordered list of languages to consider for the translation. */ while (1) { /* Make CATEGORYVALUE point to the next element of the list. */ while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') ++categoryvalue; if (categoryvalue[0] == '\0') { /* The whole contents of CATEGORYVALUE has been searched but no valid entry has been found. We solve this situation by implicitly appending a "C" entry, i.e. no translation will take place. */ single_locale[0] = 'C'; single_locale[1] = '\0'; } else { char *cp = single_locale; while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') *cp++ = *categoryvalue++; *cp = '\0'; /* When this is a SUID binary we must not allow accessing files outside the dedicated directories. */ if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale)) /* Ingore this entry. */ continue; } /* If the current locale value is C (or POSIX) we don't load a domain. Return the MSGID. */ if (strcmp (single_locale, "C") == 0 || strcmp (single_locale, "POSIX") == 0) { FREE_BLOCKS (block_list); __libc_rwlock_unlock (_nl_state_lock); __set_errno (saved_errno); return (plural == 0 ? (char *) msgid1 /* Use the Germanic plural rule. */ : n == 1 ? (char *) msgid1 : (char *) msgid2); } /* Find structure describing the message catalog matching the DOMAINNAME and CATEGORY. */ domain = _nl_find_domain (dirname, single_locale, xdomainname, binding); if (domain != NULL) { retval = _nl_find_msg (domain, binding, msgid1, &retlen); if (retval == NULL) { int cnt; for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) { retval = _nl_find_msg (domain->successor[cnt], binding, msgid1, &retlen); if (retval != NULL) { domain = domain->successor[cnt]; break; } } } if (retval != NULL) { /* Found the translation of MSGID1 in domain DOMAIN: starting at RETVAL, RETLEN bytes. */ FREE_BLOCKS (block_list); __set_errno (saved_errno); #if defined HAVE_TSEARCH || defined _LIBC if (foundp == NULL) { /* Create a new entry and add it to the search tree. */ struct known_translation_t *newp; newp = (struct known_translation_t *) malloc (offsetof (struct known_translation_t, msgid) + msgid_len + domainname_len + 1); if (newp != NULL) { newp->domainname = mempcpy (newp->msgid, msgid1, msgid_len); memcpy (newp->domainname, domainname, domainname_len + 1); newp->category = category; newp->counter = _nl_msg_cat_cntr; newp->domain = domain; newp->translation = retval; newp->translation_length = retlen; /* Insert the entry in the search tree. */ foundp = (struct known_translation_t **) tsearch (newp, &root, transcmp); if (foundp == NULL || __builtin_expect (*foundp != newp, 0)) /* The insert failed. */ free (newp); } } else { /* We can update the existing entry. */ (*foundp)->counter = _nl_msg_cat_cntr; (*foundp)->domain = domain; (*foundp)->translation = retval; (*foundp)->translation_length = retlen; } #endif /* Now deal with plural. */ if (plural) retval = plural_lookup (domain, n, retval, retlen); __libc_rwlock_unlock (_nl_state_lock); return retval; } } } /* NOTREACHED */ } char * internal_function _nl_find_msg (domain_file, domainbinding, msgid, lengthp) struct loaded_l10nfile *domain_file; struct binding *domainbinding; const char *msgid; size_t *lengthp; { struct loaded_domain *domain; size_t act; char *result; size_t resultlen; if (domain_file->decided == 0) _nl_load_domain (domain_file, domainbinding); if (domain_file->data == NULL) return NULL; domain = (struct loaded_domain *) domain_file->data; /* Locate the MSGID and its translation. */ if (domain->hash_size > 2 && domain->hash_tab != NULL) { /* Use the hashing table. */ nls_uint32 len = strlen (msgid); nls_uint32 hash_val = hash_string (msgid); nls_uint32 idx = hash_val % domain->hash_size; nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); while (1) { nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); if (nstr == 0) /* Hash table entry is empty. */ return NULL; /* Compare msgid with the original string at index nstr-1. We compare the lengths with >=, not ==, because plural entries are represented by strings with an embedded NUL. */ if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) >= len && (strcmp (msgid, domain->data + W (domain->must_swap, domain->orig_tab[nstr - 1].offset)) == 0)) { act = nstr - 1; goto found; } if (idx >= domain->hash_size - incr) idx -= domain->hash_size - incr; else idx += incr; } /* NOTREACHED */ } else { /* Try the default method: binary search in the sorted array of messages. */ size_t top, bottom; bottom = 0; top = domain->nstrings; while (bottom < top) { int cmp_val; act = (bottom + top) / 2; cmp_val = strcmp (msgid, (domain->data + W (domain->must_swap, domain->orig_tab[act].offset))); if (cmp_val < 0) top = act; else if (cmp_val > 0) bottom = act + 1; else goto found; } /* No translation was found. */ return NULL; } found: /* The translation was found at index ACT. If we have to convert the string to use a different character set, this is the time. */ result = ((char *) domain->data + W (domain->must_swap, domain->trans_tab[act].offset)); resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1; #if defined _LIBC || HAVE_ICONV if (domain->codeset_cntr != (domainbinding != NULL ? domainbinding->codeset_cntr : 0)) { /* The domain's codeset has changed through bind_textdomain_codeset() since the message catalog was initialized or last accessed. We have to reinitialize the converter. */ _nl_free_domain_conv (domain); _nl_init_domain_conv (domain_file, domain, domainbinding); } if ( # ifdef _LIBC domain->conv != (__gconv_t) -1 # else # if HAVE_ICONV domain->conv != (iconv_t) -1 # endif # endif ) { /* We are supposed to do a conversion. First allocate an appropriate table with the same structure as the table of translations in the file, where we can put the pointers to the converted strings in. There is a slight complication with plural entries. They are represented by consecutive NUL terminated strings. We handle this case by converting RESULTLEN bytes, including NULs. */ if (domain->conv_tab == NULL && ((domain->conv_tab = (char **) calloc (domain->nstrings, sizeof (char *))) == NULL)) /* Mark that we didn't succeed allocating a table. */ domain->conv_tab = (char **) -1; if (__builtin_expect (domain->conv_tab == (char **) -1, 0)) /* Nothing we can do, no more memory. */ goto converted; if (domain->conv_tab[act] == NULL) { /* We haven't used this string so far, so it is not translated yet. Do this now. */ /* We use a bit more efficient memory handling. We allocate always larger blocks which get used over time. This is faster than many small allocations. */ __libc_lock_define_initialized (static, lock) # define INITIAL_BLOCK_SIZE 4080 static unsigned char *freemem; static size_t freemem_size; const unsigned char *inbuf; unsigned char *outbuf; int malloc_count; # ifndef _LIBC transmem_block_t *transmem_list = NULL; # endif __libc_lock_lock (lock); inbuf = (const unsigned char *) result; outbuf = freemem + sizeof (size_t); malloc_count = 0; while (1) { transmem_block_t *newmem; # ifdef _LIBC size_t non_reversible; int res; if (freemem_size < sizeof (size_t)) goto resize_freemem; res = __gconv (domain->conv, &inbuf, inbuf + resultlen, &outbuf, outbuf + freemem_size - sizeof (size_t), &non_reversible); if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT) break; if (res != __GCONV_FULL_OUTPUT) { __libc_lock_unlock (lock); goto converted; } inbuf = result; # else # if HAVE_ICONV const char *inptr = (const char *) inbuf; size_t inleft = resultlen; char *outptr = (char *) outbuf; size_t outleft; if (freemem_size < sizeof (size_t)) goto resize_freemem; outleft = freemem_size - sizeof (size_t); if (iconv (domain->conv, (ICONV_CONST char **) &inptr, &inleft, &outptr, &outleft) != (size_t) (-1)) { outbuf = (unsigned char *) outptr; break; } if (errno != E2BIG) { __libc_lock_unlock (lock); goto converted; } # endif # endif resize_freemem: /* We must allocate a new buffer or resize the old one. */ if (malloc_count > 0) { ++malloc_count; freemem_size = malloc_count * INITIAL_BLOCK_SIZE; newmem = (transmem_block_t *) realloc (transmem_list, freemem_size); # ifdef _LIBC if (newmem != NULL) transmem_list = transmem_list->next; else { struct transmem_list *old = transmem_list; transmem_list = transmem_list->next; free (old); } # endif } else { malloc_count = 1; freemem_size = INITIAL_BLOCK_SIZE; newmem = (transmem_block_t *) malloc (freemem_size); } if (__builtin_expect (newmem == NULL, 0)) { freemem = NULL; freemem_size = 0; __libc_lock_unlock (lock); goto converted; } # ifdef _LIBC /* Add the block to the list of blocks we have to free at some point. */ newmem->next = transmem_list; transmem_list = newmem; freemem = newmem->data; freemem_size -= offsetof (struct transmem_list, data); # else transmem_list = newmem; freemem = newmem; # endif outbuf = freemem + sizeof (size_t); } /* We have now in our buffer a converted string. Put this into the table of conversions. */ *(size_t *) freemem = outbuf - freemem - sizeof (size_t); domain->conv_tab[act] = (char *) freemem; /* Shrink freemem, but keep it aligned. */ freemem_size -= outbuf - freemem; freemem = outbuf; freemem += freemem_size & (alignof (size_t) - 1); freemem_size = freemem_size & ~ (alignof (size_t) - 1); __libc_lock_unlock (lock); } /* Now domain->conv_tab[act] contains the translation of all the plural variants. */ result = domain->conv_tab[act] + sizeof (size_t); resultlen = *(size_t *) domain->conv_tab[act]; } converted: /* The result string is converted. */ #endif /* _LIBC || HAVE_ICONV */ *lengthp = resultlen; return result; } /* Look up a plural variant. */ static char * internal_function plural_lookup (domain, n, translation, translation_len) struct loaded_l10nfile *domain; unsigned long int n; const char *translation; size_t translation_len; { struct loaded_domain *domaindata = (struct loaded_domain *) domain->data; unsigned long int index; const char *p; index = plural_eval (domaindata->plural, n); if (index >= domaindata->nplurals) /* This should never happen. It means the plural expression and the given maximum value do not match. */ index = 0; /* Skip INDEX strings at TRANSLATION. */ p = translation; while (index-- > 0) { #ifdef _LIBC p = __rawmemchr (p, '\0'); #else p = strchr (p, '\0'); #endif /* And skip over the NUL byte. */ p++; if (p >= translation + translation_len) /* This should never happen. It means the plural expression evaluated to a value larger than the number of variants available for MSGID1. */ return (char *) translation; } return (char *) p; } /* Return string representation of locale CATEGORY. */ static const char * internal_function category_to_name (category) int category; { const char *retval; switch (category) { #ifdef LC_COLLATE case LC_COLLATE: retval = "LC_COLLATE"; break; #endif #ifdef LC_CTYPE case LC_CTYPE: retval = "LC_CTYPE"; break; #endif #ifdef LC_MONETARY case LC_MONETARY: retval = "LC_MONETARY"; break; #endif #ifdef LC_NUMERIC case LC_NUMERIC: retval = "LC_NUMERIC"; break; #endif #ifdef LC_TIME case LC_TIME: retval = "LC_TIME"; break; #endif #ifdef LC_MESSAGES case LC_MESSAGES: retval = "LC_MESSAGES"; break; #endif #ifdef LC_RESPONSE case LC_RESPONSE: retval = "LC_RESPONSE"; break; #endif #ifdef LC_ALL case LC_ALL: /* This might not make sense but is perhaps better than any other value. */ retval = "LC_ALL"; break; #endif default: /* If you have a better idea for a default value let me know. */ retval = "LC_XXX"; } return retval; } /* Guess value of current locale from value of the environment variables. */ static const char * internal_function guess_category_value (category, categoryname) int category; const char *categoryname; { const char *language; const char *retval; /* The highest priority value is the `LANGUAGE' environment variable. But we don't use the value if the currently selected locale is the C locale. This is a GNU extension. */ language = getenv ("LANGUAGE"); if (language != NULL && language[0] == '\0') language = NULL; /* We have to proceed with the POSIX methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some systems this can be done by the `setlocale' function itself. */ #ifdef _LIBC retval = setlocale (category, NULL); #else retval = _nl_locale_name (category, categoryname); #endif /* Ignore LANGUAGE if the locale is set to "C" because 1. "C" locale usually uses the ASCII encoding, and most international messages use non-ASCII characters. These characters get displayed as question marks (if using glibc's iconv()) or as invalid 8-bit characters (because other iconv()s refuse to convert most non-ASCII characters to ASCII). In any case, the output is ugly. 2. The precise output of some programs in the "C" locale is specified by POSIX and should not depend on environment variables like "LANGUAGE". We allow such programs to use gettext(). */ return language != NULL && strcmp (retval, "C") != 0 ? language : retval; } /* @@ begin of epilog @@ */ /* We don't want libintl.a to depend on any other library. So we avoid the non-standard function stpcpy. In GNU C Library this function is available, though. Also allow the symbol HAVE_STPCPY to be defined. */ #if !_LIBC && !HAVE_STPCPY static char * stpcpy (dest, src) char *dest; const char *src; { while ((*dest++ = *src++) != '\0') /* Do nothing. */ ; return dest - 1; } #endif #if !_LIBC && !HAVE_MEMPCPY static void * mempcpy (dest, src, n) void *dest; const void *src; size_t n; { return (void *) ((char *) memcpy (dest, src, n) + n); } #endif #ifdef _LIBC /* If we want to free all resources we have to do some work at program's end. */ static void __attribute__ ((unused)) free_mem (void) { void *old; while (_nl_domain_bindings != NULL) { struct binding *oldp = _nl_domain_bindings; _nl_domain_bindings = _nl_domain_bindings->next; if (oldp->dirname != _nl_default_dirname) /* Yes, this is a pointer comparison. */ free (oldp->dirname); free (oldp->codeset); free (oldp); } if (_nl_current_default_domain != _nl_default_default_domain) /* Yes, again a pointer comparison. */ free ((char *) _nl_current_default_domain); /* Remove the search tree with the known translations. */ __tdestroy (root, free); root = NULL; while (transmem_list != NULL) { old = transmem_list; transmem_list = transmem_list->next; free (old); } } text_set_element (__libc_subfreeres, free_mem); #endif sed-3.62/intl/dcngettext.c0000644000076600007660000000354510143704203012440 00000000000000/* Implementation of the dcngettext(3) function. Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DCNGETTEXT __dcngettext # define DCIGETTEXT __dcigettext #else # define DCNGETTEXT dcngettext__ # define DCIGETTEXT dcigettext__ #endif /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ char * DCNGETTEXT (domainname, msgid1, msgid2, n, category) const char *domainname; const char *msgid1; const char *msgid2; unsigned long int n; int category; { return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dcngettext, dcngettext); #endif sed-3.62/intl/dgettext.c0000644000076600007660000000337610143704203012121 00000000000000/* Implementation of the dgettext(3) function. Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DGETTEXT __dgettext # define DCGETTEXT __dcgettext #else # define DGETTEXT dgettext__ # define DCGETTEXT dcgettext__ #endif /* Look up MSGID in the DOMAINNAME message catalog of the current LC_MESSAGES locale. */ char * DGETTEXT (domainname, msgid) const char *domainname; const char *msgid; { return DCGETTEXT (domainname, msgid, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dgettext, dgettext); #endif sed-3.62/intl/dngettext.c0000644000076600007660000000360510143704203012272 00000000000000/* Implementation of the dngettext(3) function. Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DNGETTEXT __dngettext # define DCNGETTEXT __dcngettext #else # define DNGETTEXT dngettext__ # define DCNGETTEXT dcngettext__ #endif /* Look up MSGID in the DOMAINNAME message catalog of the current LC_MESSAGES locale and skip message according to the plural form. */ char * DNGETTEXT (domainname, msgid1, msgid2, n) const char *domainname; const char *msgid1; const char *msgid2; unsigned long int n; { return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dngettext, dngettext); #endif sed-3.62/intl/eval-plural.h0000644000076600007660000000526610143704203012522 00000000000000/* Plural expression evaluation. Copyright (C) 2000, 2001 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef STATIC #define STATIC static #endif /* Evaluate the plural expression and return an index value. */ STATIC unsigned long int plural_eval PARAMS ((struct expression *pexp, unsigned long int n)) internal_function; STATIC unsigned long int internal_function plural_eval (pexp, n) struct expression *pexp; unsigned long int n; { switch (pexp->nargs) { case 0: switch (pexp->operation) { case var: return n; case num: return pexp->val.num; default: break; } /* NOTREACHED */ break; case 1: { /* pexp->operation must be lnot. */ unsigned long int arg = plural_eval (pexp->val.args[0], n); return ! arg; } case 2: { unsigned long int leftarg = plural_eval (pexp->val.args[0], n); if (pexp->operation == lor) return leftarg || plural_eval (pexp->val.args[1], n); else if (pexp->operation == land) return leftarg && plural_eval (pexp->val.args[1], n); else { unsigned long int rightarg = plural_eval (pexp->val.args[1], n); switch (pexp->operation) { case mult: return leftarg * rightarg; case divide: return leftarg / rightarg; case module: return leftarg % rightarg; case plus: return leftarg + rightarg; case minus: return leftarg - rightarg; case less_than: return leftarg < rightarg; case greater_than: return leftarg > rightarg; case less_or_equal: return leftarg <= rightarg; case greater_or_equal: return leftarg >= rightarg; case equal: return leftarg == rightarg; case not_equal: return leftarg != rightarg; default: break; } } /* NOTREACHED */ break; } case 3: { /* pexp->operation must be qmop. */ unsigned long int boolarg = plural_eval (pexp->val.args[0], n); return plural_eval (pexp->val.args[boolarg ? 1 : 2], n); } } /* NOTREACHED */ return 0; } sed-3.62/intl/explodename.c0000644000076600007660000001105010143704203012556 00000000000000/* Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. Contributed by Ulrich Drepper , 1995. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "loadinfo.h" /* On some strange systems still no definition of NULL is found. Sigh! */ #ifndef NULL # if defined __STDC__ && __STDC__ # define NULL ((void *) 0) # else # define NULL 0 # endif #endif /* @@ end of prolog @@ */ char * _nl_find_language (name) const char *name; { while (name[0] != '\0' && name[0] != '_' && name[0] != '@' && name[0] != '+' && name[0] != ',') ++name; return (char *) name; } int _nl_explode_name (name, language, modifier, territory, codeset, normalized_codeset, special, sponsor, revision) char *name; const char **language; const char **modifier; const char **territory; const char **codeset; const char **normalized_codeset; const char **special; const char **sponsor; const char **revision; { enum { undecided, xpg, cen } syntax; char *cp; int mask; *modifier = NULL; *territory = NULL; *codeset = NULL; *normalized_codeset = NULL; *special = NULL; *sponsor = NULL; *revision = NULL; /* Now we determine the single parts of the locale name. First look for the language. Termination symbols are `_' and `@' if we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ mask = 0; syntax = undecided; *language = cp = name; cp = _nl_find_language (*language); if (*language == cp) /* This does not make sense: language has to be specified. Use this entry as it is without exploding. Perhaps it is an alias. */ cp = strchr (*language, '\0'); else if (cp[0] == '_') { /* Next is the territory. */ cp[0] = '\0'; *territory = ++cp; while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= TERRITORY; if (cp[0] == '.') { /* Next is the codeset. */ syntax = xpg; cp[0] = '\0'; *codeset = ++cp; while (cp[0] != '\0' && cp[0] != '@') ++cp; mask |= XPG_CODESET; if (*codeset != cp && (*codeset)[0] != '\0') { *normalized_codeset = _nl_normalize_codeset (*codeset, cp - *codeset); if (strcmp (*codeset, *normalized_codeset) == 0) free ((char *) *normalized_codeset); else mask |= XPG_NORM_CODESET; } } } if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) { /* Next is the modifier. */ syntax = cp[0] == '@' ? xpg : cen; cp[0] = '\0'; *modifier = ++cp; while (syntax == cen && cp[0] != '\0' && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= XPG_MODIFIER | CEN_AUDIENCE; } if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) { syntax = cen; if (cp[0] == '+') { /* Next is special application (CEN syntax). */ cp[0] = '\0'; *special = ++cp; while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= CEN_SPECIAL; } if (cp[0] == ',') { /* Next is sponsor (CEN syntax). */ cp[0] = '\0'; *sponsor = ++cp; while (cp[0] != '\0' && cp[0] != '_') ++cp; mask |= CEN_SPONSOR; } if (cp[0] == '_') { /* Next is revision (CEN syntax). */ cp[0] = '\0'; *revision = ++cp; mask |= CEN_REVISION; } } /* For CEN syntax values it might be important to have the separator character in the file name, not for XPG syntax. */ if (syntax == xpg) { if (*territory != NULL && (*territory)[0] == '\0') mask &= ~TERRITORY; if (*codeset != NULL && (*codeset)[0] == '\0') mask &= ~XPG_CODESET; if (*modifier != NULL && (*modifier)[0] == '\0') mask &= ~XPG_MODIFIER; } return mask; } sed-3.62/intl/finddomain.c0000644000076600007660000001314610143704203012375 00000000000000/* Handle list of needed message catalogs Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. Written by Ulrich Drepper , 1995. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* List of already loaded domains. */ static struct loaded_l10nfile *_nl_loaded_domains; /* Return a data structure describing the message catalog described by the DOMAINNAME and CATEGORY parameters with respect to the currently established bindings. */ struct loaded_l10nfile * internal_function _nl_find_domain (dirname, locale, domainname, domainbinding) const char *dirname; char *locale; const char *domainname; struct binding *domainbinding; { struct loaded_l10nfile *retval; const char *language; const char *modifier; const char *territory; const char *codeset; const char *normalized_codeset; const char *special; const char *sponsor; const char *revision; const char *alias_value; int mask; /* LOCALE can consist of up to four recognized parts for the XPG syntax: language[_territory[.codeset]][@modifier] and six parts for the CEN syntax: language[_territory][+audience][+special][,[sponsor][_revision]] Beside the first part all of them are allowed to be missing. If the full specified locale is not found, the less specific one are looked for. The various parts will be stripped off according to the following order: (1) revision (2) sponsor (3) special (4) codeset (5) normalized codeset (6) territory (7) audience/modifier */ /* If we have already tested for this locale entry there has to be one data set in the list of loaded domains. */ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, strlen (dirname) + 1, 0, locale, NULL, NULL, NULL, NULL, NULL, NULL, NULL, domainname, 0); if (retval != NULL) { /* We know something about this locale. */ int cnt; if (retval->decided == 0) _nl_load_domain (retval, domainbinding); if (retval->data != NULL) return retval; for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) { if (retval->successor[cnt]->decided == 0) _nl_load_domain (retval->successor[cnt], domainbinding); if (retval->successor[cnt]->data != NULL) break; } return cnt >= 0 ? retval : NULL; /* NOTREACHED */ } /* See whether the locale value is an alias. If yes its value *overwrites* the alias name. No test for the original value is done. */ alias_value = _nl_expand_alias (locale); if (alias_value != NULL) { #if defined _LIBC || defined HAVE_STRDUP locale = strdup (alias_value); if (locale == NULL) return NULL; #else size_t len = strlen (alias_value) + 1; locale = (char *) malloc (len); if (locale == NULL) return NULL; memcpy (locale, alias_value, len); #endif } /* Now we determine the single parts of the locale name. First look for the language. Termination symbols are `_' and `@' if we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ mask = _nl_explode_name (locale, &language, &modifier, &territory, &codeset, &normalized_codeset, &special, &sponsor, &revision); /* Create all possible locale entries which might be interested in generalization. */ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, strlen (dirname) + 1, mask, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, domainname, 1); if (retval == NULL) /* This means we are out of core. */ return NULL; if (retval->decided == 0) _nl_load_domain (retval, domainbinding); if (retval->data == NULL) { int cnt; for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) { if (retval->successor[cnt]->decided == 0) _nl_load_domain (retval->successor[cnt], domainbinding); if (retval->successor[cnt]->data != NULL) break; } } /* The room for an alias was dynamically allocated. Free it now. */ if (alias_value != NULL) free (locale); /* The space for normalized_codeset is dynamically allocated. Free it. */ if (mask & XPG_NORM_CODESET) free ((void *) normalized_codeset); return retval; } #ifdef _LIBC static void __attribute__ ((unused)) free_mem (void) { struct loaded_l10nfile *runp = _nl_loaded_domains; while (runp != NULL) { struct loaded_l10nfile *here = runp; if (runp->data != NULL) _nl_unload_domain ((struct loaded_domain *) runp->data); runp = runp->next; free ((char *) here->filename); free (here); } } text_set_element (__libc_subfreeres, free_mem); #endif sed-3.62/intl/gettext.c0000644000076600007660000000354110143704203011747 00000000000000/* Implementation of gettext(3) function. Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef _LIBC # define __need_NULL # include #else # include /* Just for NULL. */ #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define GETTEXT __gettext # define DCGETTEXT __dcgettext #else # define GETTEXT gettext__ # define DCGETTEXT dcgettext__ #endif /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ char * GETTEXT (msgid) const char *msgid; { return DCGETTEXT (NULL, msgid, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__gettext, gettext); #endif sed-3.62/intl/gettextP.h0000644000076600007660000001424610143704203012100 00000000000000/* Header describing internals of libintl library. Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. Written by Ulrich Drepper , 1995. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETTEXTP_H #define _GETTEXTP_H #include /* Get size_t. */ #ifdef _LIBC # include "../iconv/gconv_int.h" #else # if HAVE_ICONV # include # endif #endif #include "loadinfo.h" #include "gmo.h" /* Get nls_uint32. */ /* @@ end of prolog @@ */ #ifndef PARAMS # if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES # define PARAMS(args) args # else # define PARAMS(args) () # endif #endif #ifndef internal_function # define internal_function #endif /* Tell the compiler when a conditional or integer expression is almost always true or almost always false. */ #ifndef HAVE_BUILTIN_EXPECT # define __builtin_expect(expr, val) (expr) #endif #ifndef W # define W(flag, data) ((flag) ? SWAP (data) : (data)) #endif #ifdef _LIBC # include # define SWAP(i) bswap_32 (i) #else static inline nls_uint32 SWAP (i) nls_uint32 i; { return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); } #endif /* The representation of an opened message catalog. */ struct loaded_domain { const char *data; int use_mmap; size_t mmap_size; int must_swap; nls_uint32 nstrings; struct string_desc *orig_tab; struct string_desc *trans_tab; nls_uint32 hash_size; nls_uint32 *hash_tab; int codeset_cntr; #ifdef _LIBC __gconv_t conv; #else # if HAVE_ICONV iconv_t conv; # endif #endif char **conv_tab; struct expression *plural; unsigned long int nplurals; }; /* We want to allocate a string at the end of the struct. But ISO C doesn't allow zero sized arrays. */ #ifdef __GNUC__ # define ZERO 0 #else # define ZERO 1 #endif /* A set of settings bound to a message domain. Used to store settings from bindtextdomain() and bind_textdomain_codeset(). */ struct binding { struct binding *next; char *dirname; int codeset_cntr; /* Incremented each time codeset changes. */ char *codeset; char domainname[ZERO]; }; /* A counter which is incremented each time some previous translations become invalid. This variable is part of the external ABI of the GNU libintl. */ extern int _nl_msg_cat_cntr; #ifndef _LIBC const char *_nl_locale_name PARAMS ((int category, const char *categoryname)); #endif struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, char *__locale, const char *__domainname, struct binding *__domainbinding)) internal_function; void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain, struct binding *__domainbinding)) internal_function; void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) internal_function; const char *_nl_init_domain_conv PARAMS ((struct loaded_l10nfile *__domain_file, struct loaded_domain *__domain, struct binding *__domainbinding)) internal_function; void _nl_free_domain_conv PARAMS ((struct loaded_domain *__domain)) internal_function; char *_nl_find_msg PARAMS ((struct loaded_l10nfile *domain_file, struct binding *domainbinding, const char *msgid, size_t *lengthp)) internal_function; #ifdef _LIBC extern char *__gettext PARAMS ((const char *__msgid)); extern char *__dgettext PARAMS ((const char *__domainname, const char *__msgid)); extern char *__dcgettext PARAMS ((const char *__domainname, const char *__msgid, int __category)); extern char *__ngettext PARAMS ((const char *__msgid1, const char *__msgid2, unsigned long int __n)); extern char *__dngettext PARAMS ((const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int n)); extern char *__dcngettext PARAMS ((const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category)); extern char *__dcigettext PARAMS ((const char *__domainname, const char *__msgid1, const char *__msgid2, int __plural, unsigned long int __n, int __category)); extern char *__textdomain PARAMS ((const char *__domainname)); extern char *__bindtextdomain PARAMS ((const char *__domainname, const char *__dirname)); extern char *__bind_textdomain_codeset PARAMS ((const char *__domainname, const char *__codeset)); #else extern char *gettext__ PARAMS ((const char *__msgid)); extern char *dgettext__ PARAMS ((const char *__domainname, const char *__msgid)); extern char *dcgettext__ PARAMS ((const char *__domainname, const char *__msgid, int __category)); extern char *ngettext__ PARAMS ((const char *__msgid1, const char *__msgid2, unsigned long int __n)); extern char *dngettext__ PARAMS ((const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n)); extern char *dcngettext__ PARAMS ((const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category)); extern char *dcigettext__ PARAMS ((const char *__domainname, const char *__msgid1, const char *__msgid2, int __plural, unsigned long int __n, int __category)); extern char *textdomain__ PARAMS ((const char *__domainname)); extern char *bindtextdomain__ PARAMS ((const char *__domainname, const char *__dirname)); extern char *bind_textdomain_codeset__ PARAMS ((const char *__domainname, const char *__codeset)); #endif /* @@ begin of epilog @@ */ #endif /* gettextP.h */ sed-3.62/intl/gmo.h0000644000076600007660000000577510143704204011066 00000000000000/* Description of GNU message catalog format: general file layout. Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETTEXT_H #define _GETTEXT_H 1 #include /* @@ end of prolog @@ */ /* The magic number of the GNU message catalog format. */ #define _MAGIC 0x950412de #define _MAGIC_SWAPPED 0xde120495 /* Revision number of the currently used .mo (binary) file format. */ #define MO_REVISION_NUMBER 0 /* The following contortions are an attempt to use the C preprocessor to determine an unsigned integral type that is 32 bits wide. An alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work when cross-compiling. */ #if __STDC__ # define UINT_MAX_32_BITS 4294967295U #else # define UINT_MAX_32_BITS 0xFFFFFFFF #endif /* If UINT_MAX isn't defined, assume it's a 32-bit type. This should be valid for all systems GNU cares about because that doesn't include 16-bit systems, and only modern systems (that certainly have ) have 64+-bit integral types. */ #ifndef UINT_MAX # define UINT_MAX UINT_MAX_32_BITS #endif #if UINT_MAX == UINT_MAX_32_BITS typedef unsigned nls_uint32; #else # if USHRT_MAX == UINT_MAX_32_BITS typedef unsigned short nls_uint32; # else # if ULONG_MAX == UINT_MAX_32_BITS typedef unsigned long nls_uint32; # else /* The following line is intended to throw an error. Using #error is not portable enough. */ "Cannot determine unsigned 32-bit data type." # endif # endif #endif /* Header for binary .mo file format. */ struct mo_file_header { /* The magic number. */ nls_uint32 magic; /* The revision number of the file format. */ nls_uint32 revision; /* The number of strings pairs. */ nls_uint32 nstrings; /* Offset of table with start offsets of original strings. */ nls_uint32 orig_tab_offset; /* Offset of table with start offsets of translation strings. */ nls_uint32 trans_tab_offset; /* Size of hashing table. */ nls_uint32 hash_tab_size; /* Offset of first hashing entry. */ nls_uint32 hash_tab_offset; }; struct string_desc { /* Length of addressed string. */ nls_uint32 length; /* Offset of string in file. */ nls_uint32 offset; }; /* @@ begin of epilog @@ */ #endif /* gettext.h */ sed-3.62/intl/hash-string.h0000644000076600007660000000357410143704204012526 00000000000000/* Description of GNU message catalog format: string hashing function. Copyright (C) 1995, 1997, 1998, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* @@ end of prolog @@ */ #ifndef PARAMS # if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES # define PARAMS(Args) Args # else # define PARAMS(Args) () # endif #endif /* We assume to have `unsigned long int' value with at least 32 bits. */ #define HASHWORDBITS 32 /* Defines the so called `hashpjw' function by P.J. Weinberger [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, 1986, 1987 Bell Telephone Laboratories, Inc.] */ static unsigned long int hash_string PARAMS ((const char *__str_param)); static inline unsigned long int hash_string (str_param) const char *str_param; { unsigned long int hval, g; const char *str = str_param; /* Compute the hash value for the given string. */ hval = 0; while (*str != '\0') { hval <<= 4; hval += (unsigned long int) *str++; g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4)); if (g != 0) { hval ^= g >> (HASHWORDBITS - 8); hval ^= g; } } return hval; } sed-3.62/intl/intl-compat.c0000644000076600007660000001123110143704204012506 00000000000000/* intl-compat.c - Stub functions to call gettext functions from GNU gettext Library. Copyright (C) 1995, 2000, 2001 Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "libgnuintl.h" #include "gettextP.h" /* @@ end of prolog @@ */ /* This file redirects the gettext functions (without prefix or suffix) to those defined in the included GNU gettext library (with "__" suffix). It is compiled into libintl when the included GNU gettext library is configured --with-included-gettext. This redirection works also in the case that the system C library or the system libintl library contain gettext/textdomain/... functions. If it didn't, we would need to add preprocessor level redirections to libgnuintl.h of the following form: # define gettext gettext__ # define dgettext dgettext__ # define dcgettext dcgettext__ # define ngettext ngettext__ # define dngettext dngettext__ # define dcngettext dcngettext__ # define textdomain textdomain__ # define bindtextdomain bindtextdomain__ # define bind_textdomain_codeset bind_textdomain_codeset__ How does this redirection work? There are two cases. A. When libintl.a is linked into an executable, it works because functions defined in the executable always override functions in the shared libraries. B. When libintl.so is used, it works because 1. those systems defining gettext/textdomain/... in the C library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer) are ELF systems and define these symbols as weak, thus explicitly letting other shared libraries override it. 2. those systems defining gettext/textdomain/... in a standalone libintl.so library (namely, Solaris 2.3 and newer) have this shared library in /usr/lib, and the linker will search /usr/lib *after* the directory where the GNU gettext library is installed. A third case, namely when libintl.a is linked into a shared library whose name is not libintl.so, is not supported. In this case, on Solaris, when -lintl precedes the linker option for the shared library containing GNU gettext, the system's gettext would indeed override the GNU gettext. Anyone doing this kind of stuff must be clever enough to 1. compile libintl.a with -fPIC, 2. remove -lintl from his linker command line. */ #undef gettext #undef dgettext #undef dcgettext #undef ngettext #undef dngettext #undef dcngettext #undef textdomain #undef bindtextdomain #undef bind_textdomain_codeset char * gettext (msgid) const char *msgid; { return gettext__ (msgid); } char * dgettext (domainname, msgid) const char *domainname; const char *msgid; { return dgettext__ (domainname, msgid); } char * dcgettext (domainname, msgid, category) const char *domainname; const char *msgid; int category; { return dcgettext__ (domainname, msgid, category); } char * ngettext (msgid1, msgid2, n) const char *msgid1; const char *msgid2; unsigned long int n; { return ngettext__ (msgid1, msgid2, n); } char * dngettext (domainname, msgid1, msgid2, n) const char *domainname; const char *msgid1; const char *msgid2; unsigned long int n; { return dngettext__ (domainname, msgid1, msgid2, n); } char * dcngettext (domainname, msgid1, msgid2, n, category) const char *domainname; const char *msgid1; const char *msgid2; unsigned long int n; int category; { return dcngettext__ (domainname, msgid1, msgid2, n, category); } char * textdomain (domainname) const char *domainname; { return textdomain__ (domainname); } char * bindtextdomain (domainname, dirname) const char *domainname; const char *dirname; { return bindtextdomain__ (domainname, dirname); } char * bind_textdomain_codeset (domainname, codeset) const char *domainname; const char *codeset; { return bind_textdomain_codeset__ (domainname, codeset); } sed-3.62/intl/l10nflist.c0000644000076600007660000002434110143704204012101 00000000000000/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. Contributed by Ulrich Drepper , 1995. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's to provide a prototype for stpcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #if defined _LIBC || defined HAVE_ARGZ_H # include #endif #include #include #include #include "loadinfo.h" /* On some strange systems still no definition of NULL is found. Sigh! */ #ifndef NULL # if defined __STDC__ && __STDC__ # define NULL ((void *) 0) # else # define NULL 0 # endif #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # ifndef stpcpy # define stpcpy(dest, src) __stpcpy(dest, src) # endif #else # ifndef HAVE_STPCPY static char *stpcpy PARAMS ((char *dest, const char *src)); # endif #endif /* Define function which are usually not available. */ #if !defined _LIBC && !defined HAVE___ARGZ_COUNT /* Returns the number of strings in ARGZ. */ static size_t argz_count__ PARAMS ((const char *argz, size_t len)); static size_t argz_count__ (argz, len) const char *argz; size_t len; { size_t count = 0; while (len > 0) { size_t part_len = strlen (argz); argz += part_len + 1; len -= part_len + 1; count++; } return count; } # undef __argz_count # define __argz_count(argz, len) argz_count__ (argz, len) #endif /* !_LIBC && !HAVE___ARGZ_COUNT */ #if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY /* Make '\0' separated arg vector ARGZ printable by converting all the '\0's except the last into the character SEP. */ static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep)); static void argz_stringify__ (argz, len, sep) char *argz; size_t len; int sep; { while (len > 0) { size_t part_len = strlen (argz); argz += part_len; len -= part_len + 1; if (len > 0) *argz++ = sep; } } # undef __argz_stringify # define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) #endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ #if !defined _LIBC && !defined HAVE___ARGZ_NEXT static char *argz_next__ PARAMS ((char *argz, size_t argz_len, const char *entry)); static char * argz_next__ (argz, argz_len, entry) char *argz; size_t argz_len; const char *entry; { if (entry) { if (entry < argz + argz_len) entry = strchr (entry, '\0') + 1; return entry >= argz + argz_len ? NULL : (char *) entry; } else if (argz_len > 0) return argz; else return 0; } # undef __argz_next # define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) #endif /* !_LIBC && !HAVE___ARGZ_NEXT */ /* Return number of bits set in X. */ static int pop PARAMS ((int x)); static inline int pop (x) int x; { /* We assume that no more than 16 bits are used. */ x = ((x & ~0x5555) >> 1) + (x & 0x5555); x = ((x & ~0x3333) >> 2) + (x & 0x3333); x = ((x >> 4) + x) & 0x0f0f; x = ((x >> 8) + x) & 0xff; return x; } struct loaded_l10nfile * _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, filename, do_allocate) struct loaded_l10nfile **l10nfile_list; const char *dirlist; size_t dirlist_len; int mask; const char *language; const char *territory; const char *codeset; const char *normalized_codeset; const char *modifier; const char *special; const char *sponsor; const char *revision; const char *filename; int do_allocate; { char *abs_filename; struct loaded_l10nfile *last = NULL; struct loaded_l10nfile *retval; char *cp; size_t entries; int cnt; /* Allocate room for the full file name. */ abs_filename = (char *) malloc (dirlist_len + strlen (language) + ((mask & TERRITORY) != 0 ? strlen (territory) + 1 : 0) + ((mask & XPG_CODESET) != 0 ? strlen (codeset) + 1 : 0) + ((mask & XPG_NORM_CODESET) != 0 ? strlen (normalized_codeset) + 1 : 0) + (((mask & XPG_MODIFIER) != 0 || (mask & CEN_AUDIENCE) != 0) ? strlen (modifier) + 1 : 0) + ((mask & CEN_SPECIAL) != 0 ? strlen (special) + 1 : 0) + (((mask & CEN_SPONSOR) != 0 || (mask & CEN_REVISION) != 0) ? (1 + ((mask & CEN_SPONSOR) != 0 ? strlen (sponsor) + 1 : 0) + ((mask & CEN_REVISION) != 0 ? strlen (revision) + 1 : 0)) : 0) + 1 + strlen (filename) + 1); if (abs_filename == NULL) return NULL; retval = NULL; last = NULL; /* Construct file name. */ memcpy (abs_filename, dirlist, dirlist_len); __argz_stringify (abs_filename, dirlist_len, PATH_SEPARATOR); cp = abs_filename + (dirlist_len - 1); *cp++ = '/'; cp = stpcpy (cp, language); if ((mask & TERRITORY) != 0) { *cp++ = '_'; cp = stpcpy (cp, territory); } if ((mask & XPG_CODESET) != 0) { *cp++ = '.'; cp = stpcpy (cp, codeset); } if ((mask & XPG_NORM_CODESET) != 0) { *cp++ = '.'; cp = stpcpy (cp, normalized_codeset); } if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) { /* This component can be part of both syntaces but has different leading characters. For CEN we use `+', else `@'. */ *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; cp = stpcpy (cp, modifier); } if ((mask & CEN_SPECIAL) != 0) { *cp++ = '+'; cp = stpcpy (cp, special); } if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) { *cp++ = ','; if ((mask & CEN_SPONSOR) != 0) cp = stpcpy (cp, sponsor); if ((mask & CEN_REVISION) != 0) { *cp++ = '_'; cp = stpcpy (cp, revision); } } *cp++ = '/'; stpcpy (cp, filename); /* Look in list of already loaded domains whether it is already available. */ last = NULL; for (retval = *l10nfile_list; retval != NULL; retval = retval->next) if (retval->filename != NULL) { int compare = strcmp (retval->filename, abs_filename); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It's not in the list. */ retval = NULL; break; } last = retval; } if (retval != NULL || do_allocate == 0) { free (abs_filename); return retval; } retval = (struct loaded_l10nfile *) malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len) * (1 << pop (mask)) * sizeof (struct loaded_l10nfile *))); if (retval == NULL) return NULL; retval->filename = abs_filename; retval->decided = (__argz_count (dirlist, dirlist_len) != 1 || ((mask & XPG_CODESET) != 0 && (mask & XPG_NORM_CODESET) != 0)); retval->data = NULL; if (last == NULL) { retval->next = *l10nfile_list; *l10nfile_list = retval; } else { retval->next = last->next; last->next = retval; } entries = 0; /* If the DIRLIST is a real list the RETVAL entry corresponds not to a real file. So we have to use the DIRLIST separation mechanism of the inner loop. */ cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask; for (; cnt >= 0; --cnt) if ((cnt & ~mask) == 0 && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) { /* Iterate over all elements of the DIRLIST. */ char *dir = NULL; while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) != NULL) retval->successor[entries++] = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, filename, 1); } retval->successor[entries] = NULL; return retval; } /* Normalize codeset name. There is no standard for the codeset names. Normalization allows the user to use any of the common names. The return value is dynamically allocated and has to be freed by the caller. */ const char * _nl_normalize_codeset (codeset, name_len) const char *codeset; size_t name_len; { int len = 0; int only_digit = 1; char *retval; char *wp; size_t cnt; for (cnt = 0; cnt < name_len; ++cnt) if (isalnum ((unsigned char) codeset[cnt])) { ++len; if (isalpha ((unsigned char) codeset[cnt])) only_digit = 0; } retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); if (retval != NULL) { if (only_digit) wp = stpcpy (retval, "iso"); else wp = retval; for (cnt = 0; cnt < name_len; ++cnt) if (isalpha ((unsigned char) codeset[cnt])) *wp++ = tolower ((unsigned char) codeset[cnt]); else if (isdigit ((unsigned char) codeset[cnt])) *wp++ = codeset[cnt]; *wp = '\0'; } return (const char *) retval; } /* @@ begin of epilog @@ */ /* We don't want libintl.a to depend on any other library. So we avoid the non-standard function stpcpy. In GNU C Library this function is available, though. Also allow the symbol HAVE_STPCPY to be defined. */ #if !_LIBC && !HAVE_STPCPY static char * stpcpy (dest, src) char *dest; const char *src; { while ((*dest++ = *src++) != '\0') /* Do nothing. */ ; return dest - 1; } #endif sed-3.62/intl/libgnuintl.h0000644000076600007660000001123610143704204012440 00000000000000/* Message catalogs for internationalization. Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _LIBINTL_H #define _LIBINTL_H 1 #include /* The LC_MESSAGES locale category is the category used by the functions gettext() and dgettext(). It is specified in POSIX, but not in ANSI C. On systems that don't define it, use an arbitrary value instead. On Solaris, defines __LOCALE_H then includes (i.e. this file!) and then only defines LC_MESSAGES. To avoid a redefinition warning, don't define LC_MESSAGES in this case. */ #if !defined LC_MESSAGES && !defined __LOCALE_H # define LC_MESSAGES 1729 #endif /* We define an additional symbol to signal that we use the GNU implementation of gettext. */ #define __USE_GNU_GETTEXT 1 /* Resolve a platform specific conflict on DJGPP. GNU gettext takes precedence over _conio_gettext. */ #ifdef __DJGPP__ # undef gettext # define gettext gettext #endif /* Use _INTL_PARAMS, not PARAMS, in order to avoid clashes with identifiers used by programs. Similarly, test __PROTOTYPES, not PROTOTYPES. */ #ifndef _INTL_PARAMS # if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES # define _INTL_PARAMS(args) args # else # define _INTL_PARAMS(args) () # endif #endif #ifdef __cplusplus extern "C" { #endif /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ extern char *gettext _INTL_PARAMS ((const char *__msgid)); /* Look up MSGID in the DOMAINNAME message catalog for the current LC_MESSAGES locale. */ extern char *dgettext _INTL_PARAMS ((const char *__domainname, const char *__msgid)); /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ extern char *dcgettext _INTL_PARAMS ((const char *__domainname, const char *__msgid, int __category)); /* Similar to `gettext' but select the plural form corresponding to the number N. */ extern char *ngettext _INTL_PARAMS ((const char *__msgid1, const char *__msgid2, unsigned long int __n)); /* Similar to `dgettext' but select the plural form corresponding to the number N. */ extern char *dngettext _INTL_PARAMS ((const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n)); /* Similar to `dcgettext' but select the plural form corresponding to the number N. */ extern char *dcngettext _INTL_PARAMS ((const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category)); /* Set the current default message catalog to DOMAINNAME. If DOMAINNAME is null, return the current default. If DOMAINNAME is "", reset to the default of "messages". */ extern char *textdomain _INTL_PARAMS ((const char *__domainname)); /* Specify that the DOMAINNAME message catalog will be found in DIRNAME rather than in the system locale data base. */ extern char *bindtextdomain _INTL_PARAMS ((const char *__domainname, const char *__dirname)); /* Specify the character encoding in which the messages from the DOMAINNAME message catalog will be returned. */ extern char *bind_textdomain_codeset _INTL_PARAMS ((const char *__domainname, const char *__codeset)); /* Optimized version of the functions above. */ #if defined __OPTIMIZED /* These are macros, but could also be inline functions. */ # define gettext(msgid) \ dgettext (NULL, msgid) # define dgettext(domainname, msgid) \ dcgettext (domainname, msgid, LC_MESSAGES) # define ngettext(msgid1, msgid2, n) \ dngettext (NULL, msgid1, msgid2, n) # define dngettext(domainname, msgid1, msgid2, n) \ dcngettext (domainname, msgid1, msgid2, n, LC_MESSAGES) #endif /* Optimizing. */ #ifdef __cplusplus } #endif #endif /* libintl.h */ sed-3.62/intl/loadinfo.h0000644000076600007660000000751110143704204012065 00000000000000/* Copyright (C) 1996-1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _LOADINFO_H #define _LOADINFO_H 1 /* Declarations of locale dependent catalog lookup functions. Implemented in localealias.c Possibly replace a locale name by another. explodename.c Split a locale name into its various fields. l10nflist.c Generate a list of filenames of possible message catalogs. finddomain.c Find and open the relevant message catalogs. The main function _nl_find_domain() in finddomain.c is declared in gettextP.h. */ #ifndef PARAMS # if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES # define PARAMS(args) args # else # define PARAMS(args) () # endif #endif #ifndef internal_function # define internal_function #endif /* Tell the compiler when a conditional or integer expression is almost always true or almost always false. */ #ifndef HAVE_BUILTIN_EXPECT # define __builtin_expect(expr, val) (expr) #endif /* Separator in PATH like lists of pathnames. */ #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS */ # define PATH_SEPARATOR ';' #else /* Unix */ # define PATH_SEPARATOR ':' #endif /* Encoding of locale name parts. */ #define CEN_REVISION 1 #define CEN_SPONSOR 2 #define CEN_SPECIAL 4 #define XPG_NORM_CODESET 8 #define XPG_CODESET 16 #define TERRITORY 32 #define CEN_AUDIENCE 64 #define XPG_MODIFIER 128 #define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) #define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) struct loaded_l10nfile { const char *filename; int decided; const void *data; struct loaded_l10nfile *next; struct loaded_l10nfile *successor[1]; }; /* Normalize codeset name. There is no standard for the codeset names. Normalization allows the user to use any of the common names. The return value is dynamically allocated and has to be freed by the caller. */ extern const char *_nl_normalize_codeset PARAMS ((const char *codeset, size_t name_len)); extern struct loaded_l10nfile * _nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list, const char *dirlist, size_t dirlist_len, int mask, const char *language, const char *territory, const char *codeset, const char *normalized_codeset, const char *modifier, const char *special, const char *sponsor, const char *revision, const char *filename, int do_allocate)); extern const char *_nl_expand_alias PARAMS ((const char *name)); /* normalized_codeset is dynamically allocated and has to be freed by the caller. */ extern int _nl_explode_name PARAMS ((char *name, const char **language, const char **modifier, const char **territory, const char **codeset, const char **normalized_codeset, const char **special, const char **sponsor, const char **revision)); extern char *_nl_find_language PARAMS ((const char *name)); #endif /* loadinfo.h */ sed-3.62/intl/loadmsgcat.c0000644000076600007660000002750510143704204012410 00000000000000/* Load needed message catalogs. Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's to provide a prototype for mempcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #ifdef __GNUC__ # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif #endif #include #include #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #ifdef _LIBC # include # include #endif #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ || (defined _LIBC && defined _POSIX_MAPPED_FILES) # include # undef HAVE_MMAP # define HAVE_MMAP 1 #else # undef HAVE_MMAP #endif #include "gmo.h" #include "gettextP.h" #include "plural-exp.h" #ifdef _LIBC # include "../locale/localeinfo.h" #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ISO C functions. This is required by the standard because some ISO C functions will require linking with this object file and the name space must not be polluted. */ # define open __open # define close __close # define read __read # define mmap __mmap # define munmap __munmap #endif /* For those losing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA # define freea(p) /* nothing */ #else # define alloca(n) malloc (n) # define freea(p) free (p) #endif /* For systems that distinguish between text and binary I/O. O_BINARY is usually declared in . */ #if !defined O_BINARY && defined _O_BINARY /* For MSC-compatible compilers. */ # define O_BINARY _O_BINARY # define O_TEXT _O_TEXT #endif #ifdef __BEOS__ /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */ # undef O_BINARY # undef O_TEXT #endif /* On reasonable systems, binary I/O is the default. */ #ifndef O_BINARY # define O_BINARY 0 #endif /* We need a sign, whether a new catalog was loaded, which can be associated with all translations. This is important if the translations are cached by one of GCC's features. */ int _nl_msg_cat_cntr; /* Initialize the codeset dependent parts of an opened message catalog. Return the header entry. */ const char * internal_function _nl_init_domain_conv (domain_file, domain, domainbinding) struct loaded_l10nfile *domain_file; struct loaded_domain *domain; struct binding *domainbinding; { /* Find out about the character set the file is encoded with. This can be found (in textual form) in the entry "". If this entry does not exist or if this does not contain the `charset=' information, we will assume the charset matches the one the current locale and we don't have to perform any conversion. */ char *nullentry; size_t nullentrylen; /* Preinitialize fields, to avoid recursion during _nl_find_msg. */ domain->codeset_cntr = (domainbinding != NULL ? domainbinding->codeset_cntr : 0); #ifdef _LIBC domain->conv = (__gconv_t) -1; #else # if HAVE_ICONV domain->conv = (iconv_t) -1; # endif #endif domain->conv_tab = NULL; /* Get the header entry. */ nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen); if (nullentry != NULL) { #if defined _LIBC || HAVE_ICONV const char *charsetstr; charsetstr = strstr (nullentry, "charset="); if (charsetstr != NULL) { size_t len; char *charset; const char *outcharset; charsetstr += strlen ("charset="); len = strcspn (charsetstr, " \t\n"); charset = (char *) alloca (len + 1); # if defined _LIBC || HAVE_MEMPCPY *((char *) mempcpy (charset, charsetstr, len)) = '\0'; # else memcpy (charset, charsetstr, len); charset[len] = '\0'; # endif /* The output charset should normally be determined by the locale. But sometimes the locale is not used or not correctly set up, so we provide a possibility for the user to override this. Moreover, the value specified through bind_textdomain_codeset overrides both. */ if (domainbinding != NULL && domainbinding->codeset != NULL) outcharset = domainbinding->codeset; else { outcharset = getenv ("OUTPUT_CHARSET"); if (outcharset == NULL || outcharset[0] == '\0') { # ifdef _LIBC outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string; # else # if HAVE_ICONV extern const char *locale_charset PARAMS ((void)); outcharset = locale_charset (); # endif # endif } } # ifdef _LIBC /* We always want to use transliteration. */ outcharset = norm_add_slashes (outcharset, "TRANSLIT"); charset = norm_add_slashes (charset, NULL); if (__gconv_open (outcharset, charset, &domain->conv, GCONV_AVOID_NOCONV) != __GCONV_OK) domain->conv = (__gconv_t) -1; # else # if HAVE_ICONV /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5, we want to use transliteration. */ # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ || _LIBICONV_VERSION >= 0x0105 len = strlen (outcharset); { char *tmp = (char *) alloca (len + 10 + 1); memcpy (tmp, outcharset, len); memcpy (tmp + len, "//TRANSLIT", 10 + 1); outcharset = tmp; } # endif domain->conv = iconv_open (outcharset, charset); # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ || _LIBICONV_VERSION >= 0x0105 freea (outcharset); # endif # endif # endif freea (charset); } #endif /* _LIBC || HAVE_ICONV */ } return nullentry; } /* Frees the codeset dependent parts of an opened message catalog. */ void internal_function _nl_free_domain_conv (domain) struct loaded_domain *domain; { if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1) free (domain->conv_tab); #ifdef _LIBC if (domain->conv != (__gconv_t) -1) __gconv_close (domain->conv); #else # if HAVE_ICONV if (domain->conv != (iconv_t) -1) iconv_close (domain->conv); # endif #endif } /* Load the message catalogs specified by FILENAME. If it is no valid message catalog do nothing. */ void internal_function _nl_load_domain (domain_file, domainbinding) struct loaded_l10nfile *domain_file; struct binding *domainbinding; { int fd; size_t size; #ifdef _LIBC struct stat64 st; #else struct stat st; #endif struct mo_file_header *data = (struct mo_file_header *) -1; int use_mmap = 0; struct loaded_domain *domain; const char *nullentry; domain_file->decided = 1; domain_file->data = NULL; /* Note that it would be useless to store domainbinding in domain_file because domainbinding might be == NULL now but != NULL later (after a call to bind_textdomain_codeset). */ /* If the record does not represent a valid locale the FILENAME might be NULL. This can happen when according to the given specification the locale file name is different for XPG and CEN syntax. */ if (domain_file->filename == NULL) return; /* Try to open the addressed file. */ fd = open (domain_file->filename, O_RDONLY | O_BINARY); if (fd == -1) return; /* We must know about the size of the file. */ if ( #ifdef _LIBC __builtin_expect (fstat64 (fd, &st) != 0, 0) #else __builtin_expect (fstat (fd, &st) != 0, 0) #endif || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0) || __builtin_expect (size < sizeof (struct mo_file_header), 0)) { /* Something went wrong. */ close (fd); return; } #ifdef HAVE_MMAP /* Now we are ready to load the file. If mmap() is available we try this first. If not available or it failed we try to load it. */ data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); if (__builtin_expect (data != (struct mo_file_header *) -1, 1)) { /* mmap() call was successful. */ close (fd); use_mmap = 1; } #endif /* If the data is not yet available (i.e. mmap'ed) we try to load it manually. */ if (data == (struct mo_file_header *) -1) { size_t to_read; char *read_ptr; data = (struct mo_file_header *) malloc (size); if (data == NULL) return; to_read = size; read_ptr = (char *) data; do { long int nb = (long int) read (fd, read_ptr, to_read); if (nb <= 0) { #ifdef EINTR if (nb == -1 && errno == EINTR) continue; #endif close (fd); return; } read_ptr += nb; to_read -= nb; } while (to_read > 0); close (fd); } /* Using the magic number we can test whether it really is a message catalog file. */ if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED, 0)) { /* The magic number is wrong: not a message catalog file. */ #ifdef HAVE_MMAP if (use_mmap) munmap ((caddr_t) data, size); else #endif free (data); return; } domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); if (domain == NULL) return; domain_file->data = domain; domain->data = (char *) data; domain->use_mmap = use_mmap; domain->mmap_size = size; domain->must_swap = data->magic != _MAGIC; /* Fill in the information about the available tables. */ switch (W (domain->must_swap, data->revision)) { case 0: domain->nstrings = W (domain->must_swap, data->nstrings); domain->orig_tab = (struct string_desc *) ((char *) data + W (domain->must_swap, data->orig_tab_offset)); domain->trans_tab = (struct string_desc *) ((char *) data + W (domain->must_swap, data->trans_tab_offset)); domain->hash_size = W (domain->must_swap, data->hash_tab_size); domain->hash_tab = (nls_uint32 *) ((char *) data + W (domain->must_swap, data->hash_tab_offset)); break; default: /* This is an invalid revision. */ #ifdef HAVE_MMAP if (use_mmap) munmap ((caddr_t) data, size); else #endif free (data); free (domain); domain_file->data = NULL; return; } /* Now initialize the character set converter from the character set the file is encoded with (found in the header entry) to the domain's specified character set or the locale's character set. */ nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding); /* Also look for a plural specification. */ EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals); } #ifdef _LIBC void internal_function _nl_unload_domain (domain) struct loaded_domain *domain; { if (domain->plural != &__gettext_germanic_plural) __gettext_free_exp (domain->plural); _nl_free_domain_conv (domain); # ifdef _POSIX_MAPPED_FILES if (domain->use_mmap) munmap ((caddr_t) domain->data, domain->mmap_size); else # endif /* _POSIX_MAPPED_FILES */ free ((void *) domain->data); free (domain); } #endif sed-3.62/intl/localcharset.c0000644000076600007660000002070010143704205012725 00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2002 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Bruno Haible . */ #ifdef HAVE_CONFIG_H # include #endif #if HAVE_STDDEF_H # include #endif #include #if HAVE_STRING_H # include #else # include #endif #if HAVE_STDLIB_H # include #endif #if defined _WIN32 || defined __WIN32__ # undef WIN32 /* avoid warning on mingw32 */ # define WIN32 #endif #if defined __EMX__ /* Assume EMX program runs on OS/2, even if compiled under DOS. */ # define OS2 #endif #if !defined WIN32 # if HAVE_LANGINFO_CODESET # include # else # if HAVE_SETLOCALE # include # endif # endif #elif defined WIN32 # define WIN32_LEAN_AND_MEAN # include #endif #if defined OS2 # define INCL_DOS # include #endif #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') #endif #ifndef DIRECTORY_SEPARATOR # define DIRECTORY_SEPARATOR '/' #endif #ifndef ISSLASH # define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) #endif #ifdef HAVE_GETC_UNLOCKED # undef getc # define getc getc_unlocked #endif /* The following static variable is declared 'volatile' to avoid a possible multithread problem in the function get_charset_aliases. If we are running in a threaded environment, and if two threads initialize 'charset_aliases' simultaneously, both will produce the same value, and everything will be ok if the two assignments to 'charset_aliases' are atomic. But I don't know what will happen if the two assignments mix. */ #if __STDC__ != 1 # define volatile /* empty */ #endif /* Pointer to the contents of the charset.alias file, if it has already been read, else NULL. Its format is: ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ static const char * volatile charset_aliases; /* Return a pointer to the contents of the charset.alias file. */ static const char * get_charset_aliases () { const char *cp; cp = charset_aliases; if (cp == NULL) { #if !defined WIN32 FILE *fp; const char *dir = LIBDIR; const char *base = "charset.alias"; char *file_name; /* Concatenate dir and base into freshly allocated file_name. */ { size_t dir_len = strlen (dir); size_t base_len = strlen (base); int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); file_name = (char *) malloc (dir_len + add_slash + base_len + 1); if (file_name != NULL) { memcpy (file_name, dir, dir_len); if (add_slash) file_name[dir_len] = DIRECTORY_SEPARATOR; memcpy (file_name + dir_len + add_slash, base, base_len + 1); } } if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) /* Out of memory or file not found, treat it as empty. */ cp = ""; else { /* Parse the file's contents. */ int c; char buf1[50+1]; char buf2[50+1]; char *res_ptr = NULL; size_t res_size = 0; size_t l1, l2; for (;;) { c = getc (fp); if (c == EOF) break; if (c == '\n' || c == ' ' || c == '\t') continue; if (c == '#') { /* Skip comment, to end of line. */ do c = getc (fp); while (!(c == EOF || c == '\n')); if (c == EOF) break; continue; } ungetc (c, fp); if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) break; l1 = strlen (buf1); l2 = strlen (buf2); if (res_size == 0) { res_size = l1 + 1 + l2 + 1; res_ptr = (char *) malloc (res_size + 1); } else { res_size += l1 + 1 + l2 + 1; res_ptr = (char *) realloc (res_ptr, res_size + 1); } if (res_ptr == NULL) { /* Out of memory. */ res_size = 0; break; } strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); strcpy (res_ptr + res_size - (l2 + 1), buf2); } fclose (fp); if (res_size == 0) cp = ""; else { *(res_ptr + res_size) = '\0'; cp = res_ptr; } } if (file_name != NULL) free (file_name); #else /* To avoid the troubles of installing a separate file in the same directory as the DLL and of retrieving the DLL's directory at runtime, simply inline the aliases here. */ # if defined WIN32 cp = "CP936" "\0" "GBK" "\0" "CP1361" "\0" "JOHAB" "\0"; # endif #endif charset_aliases = cp; } return cp; } /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed in config.charset. The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical name. */ #ifdef STATIC STATIC #endif const char * locale_charset () { const char *codeset; const char *aliases; #if !(defined WIN32 || defined OS2) # if HAVE_LANGINFO_CODESET /* Most systems support nl_langinfo (CODESET) nowadays. */ codeset = nl_langinfo (CODESET); # else /* On old systems which lack it, use setlocale or getenv. */ const char *locale = NULL; /* But most old systems don't have a complete set of locales. Some (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't use setlocale here; it would return "C" when it doesn't support the locale name the user has set. */ # if HAVE_SETLOCALE && 0 locale = setlocale (LC_CTYPE, NULL); # endif if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } } /* On some old systems, one used to set locale = "iso8859_1". On others, you set it to "language_COUNTRY.charset". In any case, we resolve it through the charset.alias file. */ codeset = locale; # endif #elif defined WIN32 static char buf[2 + 10 + 1]; /* Win32 has a function returning the locale's codepage as a number. */ sprintf (buf, "CP%u", GetACP ()); codeset = buf; #elif defined OS2 const char *locale; static char buf[2 + 10 + 1]; ULONG cp[3]; ULONG cplen; /* Allow user to override the codeset, as set in the operating system, with standard language environment variables. */ locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } if (locale != NULL && locale[0] != '\0') { /* If the locale name contains an encoding after the dot, return it. */ const char *dot = strchr (locale, '.'); if (dot != NULL) { const char *modifier; dot++; /* Look for the possible @... trailer and remove it, if any. */ modifier = strchr (dot, '@'); if (modifier == NULL) return dot; if (modifier - dot < sizeof (buf)) { memcpy (buf, dot, modifier - dot); buf [modifier - dot] = '\0'; return buf; } } /* Resolve through the charset.alias file. */ codeset = locale; } else { /* OS/2 has a function returning the locale's codepage as a number. */ if (DosQueryCp (sizeof (cp), cp, &cplen)) codeset = ""; else { sprintf (buf, "CP%u", cp[0]); codeset = buf; } } #endif if (codeset == NULL) /* The canonical name cannot be determined. */ codeset = ""; /* Resolve alias. */ for (aliases = get_charset_aliases (); *aliases != '\0'; aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) if (strcmp (codeset, aliases) == 0 || (aliases[0] == '*' && aliases[1] == '\0')) { codeset = aliases + strlen (aliases) + 1; break; } return codeset; } sed-3.62/intl/locale.alias0000644000076600007660000000514110143704205012371 00000000000000# Locale name alias data base. # Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. # # This program 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, 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # The format of this file is the same as for the corresponding file of # the X Window System, which normally can be found in # /usr/lib/X11/locale/locale.alias # A single line contains two fields: an alias and a substitution value. # All entries are case independent. # Note: This file is far from being complete. If you have a value for # your own site which you think might be useful for others too, share # it with the rest of us. Send it using the `glibcbug' script to # bugs@gnu.org. # Packages using this file: bokmal no_NO.ISO-8859-1 bokmål no_NO.ISO-8859-1 catalan ca_ES.ISO-8859-1 croatian hr_HR.ISO-8859-2 czech cs_CZ.ISO-8859-2 danish da_DK.ISO-8859-1 dansk da_DK.ISO-8859-1 deutsch de_DE.ISO-8859-1 dutch nl_NL.ISO-8859-1 eesti et_EE.ISO-8859-1 estonian et_EE.ISO-8859-1 finnish fi_FI.ISO-8859-1 français fr_FR.ISO-8859-1 french fr_FR.ISO-8859-1 galego gl_ES.ISO-8859-1 galician gl_ES.ISO-8859-1 german de_DE.ISO-8859-1 greek el_GR.ISO-8859-7 hebrew he_IL.ISO-8859-8 hrvatski hr_HR.ISO-8859-2 hungarian hu_HU.ISO-8859-2 icelandic is_IS.ISO-8859-1 italian it_IT.ISO-8859-1 japanese ja_JP.eucJP japanese.euc ja_JP.eucJP ja_JP ja_JP.eucJP ja_JP.ujis ja_JP.eucJP japanese.sjis ja_JP.SJIS korean ko_KR.eucKR korean.euc ko_KR.eucKR ko_KR ko_KR.eucKR lithuanian lt_LT.ISO-8859-13 nb_NO no_NO.ISO-8859-1 nb_NO.ISO-8859-1 no_NO.ISO-8859-1 norwegian no_NO.ISO-8859-1 nynorsk nn_NO.ISO-8859-1 polish pl_PL.ISO-8859-2 portuguese pt_PT.ISO-8859-1 romanian ro_RO.ISO-8859-2 russian ru_RU.ISO-8859-5 slovak sk_SK.ISO-8859-2 slovene sl_SI.ISO-8859-2 slovenian sl_SI.ISO-8859-2 spanish es_ES.ISO-8859-1 swedish sv_SE.ISO-8859-1 thai th_TH.TIS-620 turkish tr_TR.ISO-8859-9 sed-3.62/intl/localealias.c0000644000076600007660000002330310143704205012534 00000000000000/* Handle aliases for locale names. Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's to provide a prototype for mempcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #if defined _LIBC || defined HAVE___FSETLOCKING # include #endif #include #ifdef __GNUC__ # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif #endif #include #include #include "gettextP.h" /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # define strcasecmp __strcasecmp # ifndef mempcpy # define mempcpy __mempcpy # endif # define HAVE_MEMPCPY 1 # define HAVE___FSETLOCKING 1 /* We need locking here since we can be called from different places. */ # include __libc_lock_define_initialized (static, lock); #endif #ifndef internal_function # define internal_function #endif /* Some optimizations for glibc. */ #ifdef _LIBC # define FEOF(fp) feof_unlocked (fp) # define FGETS(buf, n, fp) fgets_unlocked (buf, n, fp) #else # define FEOF(fp) feof (fp) # define FGETS(buf, n, fp) fgets (buf, n, fp) #endif /* For those losing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA # define freea(p) /* nothing */ #else # define alloca(n) malloc (n) # define freea(p) free (p) #endif #if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED # undef fgets # define fgets(buf, len, s) fgets_unlocked (buf, len, s) #endif #if defined _LIBC_REENTRANT || defined HAVE_FEOF_UNLOCKED # undef feof # define feof(s) feof_unlocked (s) #endif struct alias_map { const char *alias; const char *value; }; static char *string_space; static size_t string_space_act; static size_t string_space_max; static struct alias_map *map; static size_t nmap; static size_t maxmap; /* Prototypes for local functions. */ static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) internal_function; static int extend_alias_table PARAMS ((void)); static int alias_compare PARAMS ((const struct alias_map *map1, const struct alias_map *map2)); const char * _nl_expand_alias (name) const char *name; { static const char *locale_alias_path; struct alias_map *retval; const char *result = NULL; size_t added; #ifdef _LIBC __libc_lock_lock (lock); #endif if (locale_alias_path == NULL) locale_alias_path = LOCALE_ALIAS_PATH; do { struct alias_map item; item.alias = name; if (nmap > 0) retval = (struct alias_map *) bsearch (&item, map, nmap, sizeof (struct alias_map), (int (*) PARAMS ((const void *, const void *)) ) alias_compare); else retval = NULL; /* We really found an alias. Return the value. */ if (retval != NULL) { result = retval->value; break; } /* Perhaps we can find another alias file. */ added = 0; while (added == 0 && locale_alias_path[0] != '\0') { const char *start; while (locale_alias_path[0] == PATH_SEPARATOR) ++locale_alias_path; start = locale_alias_path; while (locale_alias_path[0] != '\0' && locale_alias_path[0] != PATH_SEPARATOR) ++locale_alias_path; if (start < locale_alias_path) added = read_alias_file (start, locale_alias_path - start); } } while (added != 0); #ifdef _LIBC __libc_lock_unlock (lock); #endif return result; } static size_t internal_function read_alias_file (fname, fname_len) const char *fname; int fname_len; { FILE *fp; char *full_fname; size_t added; static const char aliasfile[] = "/locale.alias"; full_fname = (char *) alloca (fname_len + sizeof aliasfile); #ifdef HAVE_MEMPCPY mempcpy (mempcpy (full_fname, fname, fname_len), aliasfile, sizeof aliasfile); #else memcpy (full_fname, fname, fname_len); memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); #endif fp = fopen (full_fname, "r"); freea (full_fname); if (fp == NULL) return 0; #ifdef HAVE___FSETLOCKING /* No threads present. */ __fsetlocking (fp, FSETLOCKING_BYCALLER); #endif added = 0; while (!FEOF (fp)) { /* It is a reasonable approach to use a fix buffer here because a) we are only interested in the first two fields b) these fields must be usable as file names and so must not be that long */ char buf[BUFSIZ]; char *alias; char *value; char *cp; if (FGETS (buf, sizeof buf, fp) == NULL) /* EOF reached. */ break; /* Possibly not the whole line fits into the buffer. Ignore the rest of the line. */ if (strchr (buf, '\n') == NULL) { char altbuf[BUFSIZ]; do if (FGETS (altbuf, sizeof altbuf, fp) == NULL) /* Make sure the inner loop will be left. The outer loop will exit at the `feof' test. */ break; while (strchr (altbuf, '\n') == NULL); } cp = buf; /* Ignore leading white space. */ while (isspace ((unsigned char) cp[0])) ++cp; /* A leading '#' signals a comment line. */ if (cp[0] != '\0' && cp[0] != '#') { alias = cp++; while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) ++cp; /* Terminate alias name. */ if (cp[0] != '\0') *cp++ = '\0'; /* Now look for the beginning of the value. */ while (isspace ((unsigned char) cp[0])) ++cp; if (cp[0] != '\0') { size_t alias_len; size_t value_len; value = cp++; while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) ++cp; /* Terminate value. */ if (cp[0] == '\n') { /* This has to be done to make the following test for the end of line possible. We are looking for the terminating '\n' which do not overwrite here. */ *cp++ = '\0'; *cp = '\n'; } else if (cp[0] != '\0') *cp++ = '\0'; if (nmap >= maxmap) if (__builtin_expect (extend_alias_table (), 0)) return added; alias_len = strlen (alias) + 1; value_len = strlen (value) + 1; if (string_space_act + alias_len + value_len > string_space_max) { /* Increase size of memory pool. */ size_t new_size = (string_space_max + (alias_len + value_len > 1024 ? alias_len + value_len : 1024)); char *new_pool = (char *) realloc (string_space, new_size); if (new_pool == NULL) return added; if (__builtin_expect (string_space != new_pool, 0)) { size_t i; for (i = 0; i < nmap; i++) { map[i].alias += new_pool - string_space; map[i].value += new_pool - string_space; } } string_space = new_pool; string_space_max = new_size; } map[nmap].alias = memcpy (&string_space[string_space_act], alias, alias_len); string_space_act += alias_len; map[nmap].value = memcpy (&string_space[string_space_act], value, value_len); string_space_act += value_len; ++nmap; ++added; } } } /* Should we test for ferror()? I think we have to silently ignore errors. --drepper */ fclose (fp); if (added > 0) qsort (map, nmap, sizeof (struct alias_map), (int (*) PARAMS ((const void *, const void *))) alias_compare); return added; } static int extend_alias_table () { size_t new_size; struct alias_map *new_map; new_size = maxmap == 0 ? 100 : 2 * maxmap; new_map = (struct alias_map *) realloc (map, (new_size * sizeof (struct alias_map))); if (new_map == NULL) /* Simply don't extend: we don't have any more core. */ return -1; map = new_map; maxmap = new_size; return 0; } #ifdef _LIBC static void __attribute__ ((unused)) free_mem (void) { if (string_space != NULL) free (string_space); if (map != NULL) free (map); } text_set_element (__libc_subfreeres, free_mem); #endif static int alias_compare (map1, map2) const struct alias_map *map1; const struct alias_map *map2; { #if defined _LIBC || defined HAVE_STRCASECMP return strcasecmp (map1->alias, map2->alias); #else const unsigned char *p1 = (const unsigned char *) map1->alias; const unsigned char *p2 = (const unsigned char *) map2->alias; unsigned char c1, c2; if (p1 == p2) return 0; do { /* I know this seems to be odd but the tolower() function in some systems libc cannot handle nonalpha characters. */ c1 = isupper (*p1) ? tolower (*p1) : *p1; c2 = isupper (*p2) ? tolower (*p2) : *p2; if (c1 == '\0') break; ++p1; ++p2; } while (c1 == c2); return c1 - c2; #endif } sed-3.62/intl/localename.c0000644000076600007660000004640610143704205012374 00000000000000/* Determine the current selected locale. Copyright (C) 1995-1999, 2000, 2001 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Ulrich Drepper , 1995. */ /* Win32 code written by Tor Lillqvist . */ #ifdef HAVE_CONFIG_H # include #endif #include #include #if defined _WIN32 || defined __WIN32__ # undef WIN32 /* avoid warning on mingw32 */ # define WIN32 #endif #ifdef WIN32 # define WIN32_LEAN_AND_MEAN # include /* Mingw headers don't have latest language and sublanguage codes. */ # ifndef LANG_AFRIKAANS # define LANG_AFRIKAANS 0x36 # endif # ifndef LANG_ALBANIAN # define LANG_ALBANIAN 0x1c # endif # ifndef LANG_ARABIC # define LANG_ARABIC 0x01 # endif # ifndef LANG_ARMENIAN # define LANG_ARMENIAN 0x2b # endif # ifndef LANG_ASSAMESE # define LANG_ASSAMESE 0x4d # endif # ifndef LANG_AZERI # define LANG_AZERI 0x2c # endif # ifndef LANG_BASQUE # define LANG_BASQUE 0x2d # endif # ifndef LANG_BELARUSIAN # define LANG_BELARUSIAN 0x23 # endif # ifndef LANG_BENGALI # define LANG_BENGALI 0x45 # endif # ifndef LANG_CATALAN # define LANG_CATALAN 0x03 # endif # ifndef LANG_ESTONIAN # define LANG_ESTONIAN 0x25 # endif # ifndef LANG_FAEROESE # define LANG_FAEROESE 0x38 # endif # ifndef LANG_FARSI # define LANG_FARSI 0x29 # endif # ifndef LANG_GEORGIAN # define LANG_GEORGIAN 0x37 # endif # ifndef LANG_GUJARATI # define LANG_GUJARATI 0x47 # endif # ifndef LANG_HEBREW # define LANG_HEBREW 0x0d # endif # ifndef LANG_HINDI # define LANG_HINDI 0x39 # endif # ifndef LANG_INDONESIAN # define LANG_INDONESIAN 0x21 # endif # ifndef LANG_KANNADA # define LANG_KANNADA 0x4b # endif # ifndef LANG_KASHMIRI # define LANG_KASHMIRI 0x60 # endif # ifndef LANG_KAZAK # define LANG_KAZAK 0x3f # endif # ifndef LANG_KONKANI # define LANG_KONKANI 0x57 # endif # ifndef LANG_LATVIAN # define LANG_LATVIAN 0x26 # endif # ifndef LANG_LITHUANIAN # define LANG_LITHUANIAN 0x27 # endif # ifndef LANG_MACEDONIAN # define LANG_MACEDONIAN 0x2f # endif # ifndef LANG_MALAY # define LANG_MALAY 0x3e # endif # ifndef LANG_MALAYALAM # define LANG_MALAYALAM 0x4c # endif # ifndef LANG_MANIPURI # define LANG_MANIPURI 0x58 # endif # ifndef LANG_MARATHI # define LANG_MARATHI 0x4e # endif # ifndef LANG_NEPALI # define LANG_NEPALI 0x61 # endif # ifndef LANG_ORIYA # define LANG_ORIYA 0x48 # endif # ifndef LANG_PUNJABI # define LANG_PUNJABI 0x46 # endif # ifndef LANG_SANSKRIT # define LANG_SANSKRIT 0x4f # endif # ifndef LANG_SERBIAN # define LANG_SERBIAN 0x1a # endif # ifndef LANG_SINDHI # define LANG_SINDHI 0x59 # endif # ifndef LANG_SLOVAK # define LANG_SLOVAK 0x1b # endif # ifndef LANG_SWAHILI # define LANG_SWAHILI 0x41 # endif # ifndef LANG_TAMIL # define LANG_TAMIL 0x49 # endif # ifndef LANG_TATAR # define LANG_TATAR 0x44 # endif # ifndef LANG_TELUGU # define LANG_TELUGU 0x4a # endif # ifndef LANG_THAI # define LANG_THAI 0x1e # endif # ifndef LANG_UKRAINIAN # define LANG_UKRAINIAN 0x22 # endif # ifndef LANG_URDU # define LANG_URDU 0x20 # endif # ifndef LANG_UZBEK # define LANG_UZBEK 0x43 # endif # ifndef LANG_VIETNAMESE # define LANG_VIETNAMESE 0x2a # endif # ifndef SUBLANG_ARABIC_SAUDI_ARABIA # define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 # endif # ifndef SUBLANG_ARABIC_IRAQ # define SUBLANG_ARABIC_IRAQ 0x02 # endif # ifndef SUBLANG_ARABIC_EGYPT # define SUBLANG_ARABIC_EGYPT 0x03 # endif # ifndef SUBLANG_ARABIC_LIBYA # define SUBLANG_ARABIC_LIBYA 0x04 # endif # ifndef SUBLANG_ARABIC_ALGERIA # define SUBLANG_ARABIC_ALGERIA 0x05 # endif # ifndef SUBLANG_ARABIC_MOROCCO # define SUBLANG_ARABIC_MOROCCO 0x06 # endif # ifndef SUBLANG_ARABIC_TUNISIA # define SUBLANG_ARABIC_TUNISIA 0x07 # endif # ifndef SUBLANG_ARABIC_OMAN # define SUBLANG_ARABIC_OMAN 0x08 # endif # ifndef SUBLANG_ARABIC_YEMEN # define SUBLANG_ARABIC_YEMEN 0x09 # endif # ifndef SUBLANG_ARABIC_SYRIA # define SUBLANG_ARABIC_SYRIA 0x0a # endif # ifndef SUBLANG_ARABIC_JORDAN # define SUBLANG_ARABIC_JORDAN 0x0b # endif # ifndef SUBLANG_ARABIC_LEBANON # define SUBLANG_ARABIC_LEBANON 0x0c # endif # ifndef SUBLANG_ARABIC_KUWAIT # define SUBLANG_ARABIC_KUWAIT 0x0d # endif # ifndef SUBLANG_ARABIC_UAE # define SUBLANG_ARABIC_UAE 0x0e # endif # ifndef SUBLANG_ARABIC_BAHRAIN # define SUBLANG_ARABIC_BAHRAIN 0x0f # endif # ifndef SUBLANG_ARABIC_QATAR # define SUBLANG_ARABIC_QATAR 0x10 # endif # ifndef SUBLANG_AZERI_LATIN # define SUBLANG_AZERI_LATIN 0x01 # endif # ifndef SUBLANG_AZERI_CYRILLIC # define SUBLANG_AZERI_CYRILLIC 0x02 # endif # ifndef SUBLANG_CHINESE_MACAU # define SUBLANG_CHINESE_MACAU 0x05 # endif # ifndef SUBLANG_ENGLISH_SOUTH_AFRICA # define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 # endif # ifndef SUBLANG_ENGLISH_JAMAICA # define SUBLANG_ENGLISH_JAMAICA 0x08 # endif # ifndef SUBLANG_ENGLISH_CARIBBEAN # define SUBLANG_ENGLISH_CARIBBEAN 0x09 # endif # ifndef SUBLANG_ENGLISH_BELIZE # define SUBLANG_ENGLISH_BELIZE 0x0a # endif # ifndef SUBLANG_ENGLISH_TRINIDAD # define SUBLANG_ENGLISH_TRINIDAD 0x0b # endif # ifndef SUBLANG_ENGLISH_ZIMBABWE # define SUBLANG_ENGLISH_ZIMBABWE 0x0c # endif # ifndef SUBLANG_ENGLISH_PHILIPPINES # define SUBLANG_ENGLISH_PHILIPPINES 0x0d # endif # ifndef SUBLANG_FRENCH_LUXEMBOURG # define SUBLANG_FRENCH_LUXEMBOURG 0x05 # endif # ifndef SUBLANG_FRENCH_MONACO # define SUBLANG_FRENCH_MONACO 0x06 # endif # ifndef SUBLANG_GERMAN_LUXEMBOURG # define SUBLANG_GERMAN_LUXEMBOURG 0x04 # endif # ifndef SUBLANG_GERMAN_LIECHTENSTEIN # define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 # endif # ifndef SUBLANG_KASHMIRI_INDIA # define SUBLANG_KASHMIRI_INDIA 0x02 # endif # ifndef SUBLANG_MALAY_MALAYSIA # define SUBLANG_MALAY_MALAYSIA 0x01 # endif # ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM # define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 # endif # ifndef SUBLANG_NEPALI_INDIA # define SUBLANG_NEPALI_INDIA 0x02 # endif # ifndef SUBLANG_SERBIAN_LATIN # define SUBLANG_SERBIAN_LATIN 0x02 # endif # ifndef SUBLANG_SERBIAN_CYRILLIC # define SUBLANG_SERBIAN_CYRILLIC 0x03 # endif # ifndef SUBLANG_SPANISH_GUATEMALA # define SUBLANG_SPANISH_GUATEMALA 0x04 # endif # ifndef SUBLANG_SPANISH_COSTA_RICA # define SUBLANG_SPANISH_COSTA_RICA 0x05 # endif # ifndef SUBLANG_SPANISH_PANAMA # define SUBLANG_SPANISH_PANAMA 0x06 # endif # ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC # define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 # endif # ifndef SUBLANG_SPANISH_VENEZUELA # define SUBLANG_SPANISH_VENEZUELA 0x08 # endif # ifndef SUBLANG_SPANISH_COLOMBIA # define SUBLANG_SPANISH_COLOMBIA 0x09 # endif # ifndef SUBLANG_SPANISH_PERU # define SUBLANG_SPANISH_PERU 0x0a # endif # ifndef SUBLANG_SPANISH_ARGENTINA # define SUBLANG_SPANISH_ARGENTINA 0x0b # endif # ifndef SUBLANG_SPANISH_ECUADOR # define SUBLANG_SPANISH_ECUADOR 0x0c # endif # ifndef SUBLANG_SPANISH_CHILE # define SUBLANG_SPANISH_CHILE 0x0d # endif # ifndef SUBLANG_SPANISH_URUGUAY # define SUBLANG_SPANISH_URUGUAY 0x0e # endif # ifndef SUBLANG_SPANISH_PARAGUAY # define SUBLANG_SPANISH_PARAGUAY 0x0f # endif # ifndef SUBLANG_SPANISH_BOLIVIA # define SUBLANG_SPANISH_BOLIVIA 0x10 # endif # ifndef SUBLANG_SPANISH_EL_SALVADOR # define SUBLANG_SPANISH_EL_SALVADOR 0x11 # endif # ifndef SUBLANG_SPANISH_HONDURAS # define SUBLANG_SPANISH_HONDURAS 0x12 # endif # ifndef SUBLANG_SPANISH_NICARAGUA # define SUBLANG_SPANISH_NICARAGUA 0x13 # endif # ifndef SUBLANG_SPANISH_PUERTO_RICO # define SUBLANG_SPANISH_PUERTO_RICO 0x14 # endif # ifndef SUBLANG_SWEDISH_FINLAND # define SUBLANG_SWEDISH_FINLAND 0x02 # endif # ifndef SUBLANG_URDU_PAKISTAN # define SUBLANG_URDU_PAKISTAN 0x01 # endif # ifndef SUBLANG_URDU_INDIA # define SUBLANG_URDU_INDIA 0x02 # endif # ifndef SUBLANG_UZBEK_LATIN # define SUBLANG_UZBEK_LATIN 0x01 # endif # ifndef SUBLANG_UZBEK_CYRILLIC # define SUBLANG_UZBEK_CYRILLIC 0x02 # endif #endif /* XPG3 defines the result of 'setlocale (category, NULL)' as: "Directs 'setlocale()' to query 'category' and return the current setting of 'local'." However it does not specify the exact format. Neither do SUSV2 and ISO C 99. So we can use this feature only on selected systems (e.g. those using GNU C Library). */ #if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2) # define HAVE_LOCALE_NULL #endif /* Determine the current locale's name, and canonicalize it into XPG syntax language[_territory[.codeset]][@modifier] The codeset part in the result is not reliable; the locale_charset() should be used for codeset information instead. The result must not be freed; it is statically allocated. */ const char * _nl_locale_name (category, categoryname) int category; const char *categoryname; { const char *retval; #ifndef WIN32 /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'. On some systems this can be done by the 'setlocale' function itself. */ # if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL retval = setlocale (category, NULL); # else /* Setting of LC_ALL overwrites all other. */ retval = getenv ("LC_ALL"); if (retval == NULL || retval[0] == '\0') { /* Next comes the name of the desired category. */ retval = getenv (categoryname); if (retval == NULL || retval[0] == '\0') { /* Last possibility is the LANG environment variable. */ retval = getenv ("LANG"); if (retval == NULL || retval[0] == '\0') /* We use C as the default domain. POSIX says this is implementation defined. */ retval = "C"; } } # endif return retval; #else /* WIN32 */ /* Return an XPG style locale name language[_territory][@modifier]. Don't even bother determining the codeset; it's not useful in this context, because message catalogs are not specific to a single codeset. */ LCID lcid; LANGID langid; int primary, sub; /* Let the user override the system settings through environment variables, as on POSIX systems. */ retval = getenv ("LC_ALL"); if (retval != NULL && retval[0] != '\0') return retval; retval = getenv (categoryname); if (retval != NULL && retval[0] != '\0') return retval; retval = getenv ("LANG"); if (retval != NULL && retval[0] != '\0') return retval; /* Use native Win32 API locale ID. */ lcid = GetThreadLocale (); /* Strip off the sorting rules, keep only the language part. */ langid = LANGIDFROMLCID (lcid); /* Split into language and territory part. */ primary = PRIMARYLANGID (langid); sub = SUBLANGID (langid); switch (primary) { case LANG_AFRIKAANS: return "af_ZA"; case LANG_ALBANIAN: return "sq_AL"; case LANG_ARABIC: switch (sub) { case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA"; case SUBLANG_ARABIC_IRAQ: return "ar_IQ"; case SUBLANG_ARABIC_EGYPT: return "ar_EG"; case SUBLANG_ARABIC_LIBYA: return "ar_LY"; case SUBLANG_ARABIC_ALGERIA: return "ar_DZ"; case SUBLANG_ARABIC_MOROCCO: return "ar_MA"; case SUBLANG_ARABIC_TUNISIA: return "ar_TN"; case SUBLANG_ARABIC_OMAN: return "ar_OM"; case SUBLANG_ARABIC_YEMEN: return "ar_YE"; case SUBLANG_ARABIC_SYRIA: return "ar_SY"; case SUBLANG_ARABIC_JORDAN: return "ar_JO"; case SUBLANG_ARABIC_LEBANON: return "ar_LB"; case SUBLANG_ARABIC_KUWAIT: return "ar_KW"; case SUBLANG_ARABIC_UAE: return "ar_AE"; case SUBLANG_ARABIC_BAHRAIN: return "ar_BH"; case SUBLANG_ARABIC_QATAR: return "ar_QA"; } return "ar"; case LANG_ARMENIAN: return "hy_AM"; case LANG_ASSAMESE: return "as_IN"; case LANG_AZERI: switch (sub) { /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */ case SUBLANG_AZERI_LATIN: return "az_AZ@latin"; case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic"; } return "az"; case LANG_BASQUE: return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */ case LANG_BELARUSIAN: return "be_BY"; case LANG_BENGALI: return "bn_IN"; case LANG_BULGARIAN: return "bg_BG"; case LANG_CATALAN: return "ca_ES"; case LANG_CHINESE: switch (sub) { case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW"; case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN"; case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; case SUBLANG_CHINESE_MACAU: return "zh_MO"; } return "zh"; case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN * What used to be called Serbo-Croatian * should really now be two separate * languages because of political reasons. * (Says tml, who knows nothing about Serbian * or Croatian.) * (I can feel those flames coming already.) */ switch (sub) { /* FIXME: How to distinguish Croatian and Latin Serbian locales? */ case SUBLANG_SERBIAN_LATIN: return "sr_YU"; case SUBLANG_SERBIAN_CYRILLIC: return "sr_YU@cyrillic"; default: return "hr_HR"; } case LANG_CZECH: return "cs_CZ"; case LANG_DANISH: return "da_DK"; case LANG_DUTCH: switch (sub) { case SUBLANG_DUTCH: return "nl_NL"; case SUBLANG_DUTCH_BELGIAN: return "nl_BE"; } return "nl"; case LANG_ENGLISH: switch (sub) { /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought * English was the language spoken in England. * Oh well. */ case SUBLANG_ENGLISH_US: return "en_US"; case SUBLANG_ENGLISH_UK: return "en_GB"; case SUBLANG_ENGLISH_AUS: return "en_AU"; case SUBLANG_ENGLISH_CAN: return "en_CA"; case SUBLANG_ENGLISH_NZ: return "en_NZ"; case SUBLANG_ENGLISH_EIRE: return "en_IE"; case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA"; case SUBLANG_ENGLISH_JAMAICA: return "en_JM"; case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */ case SUBLANG_ENGLISH_BELIZE: return "en_BZ"; case SUBLANG_ENGLISH_TRINIDAD: return "en_TT"; case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW"; case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH"; } return "en"; case LANG_ESTONIAN: return "et_EE"; case LANG_FAEROESE: return "fo_FO"; case LANG_FARSI: return "fa_IR"; case LANG_FINNISH: return "fi_FI"; case LANG_FRENCH: switch (sub) { case SUBLANG_FRENCH: return "fr_FR"; case SUBLANG_FRENCH_BELGIAN: return "fr_BE"; case SUBLANG_FRENCH_CANADIAN: return "fr_CA"; case SUBLANG_FRENCH_SWISS: return "fr_CH"; case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU"; case SUBLANG_FRENCH_MONACO: return "fr_MC"; } return "fr"; case LANG_GEORGIAN: return "ka_GE"; case LANG_GERMAN: switch (sub) { case SUBLANG_GERMAN: return "de_DE"; case SUBLANG_GERMAN_SWISS: return "de_CH"; case SUBLANG_GERMAN_AUSTRIAN: return "de_AT"; case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU"; case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI"; } return "de"; case LANG_GREEK: return "el_GR"; case LANG_GUJARATI: return "gu_IN"; case LANG_HEBREW: return "he_IL"; case LANG_HINDI: return "hi_IN"; case LANG_HUNGARIAN: return "hu_HU"; case LANG_ICELANDIC: return "is_IS"; case LANG_INDONESIAN: return "id_ID"; case LANG_ITALIAN: switch (sub) { case SUBLANG_ITALIAN: return "it_IT"; case SUBLANG_ITALIAN_SWISS: return "it_CH"; } return "it"; case LANG_JAPANESE: return "ja_JP"; case LANG_KANNADA: return "kn_IN"; case LANG_KASHMIRI: switch (sub) { case SUBLANG_DEFAULT: return "ks_PK"; case SUBLANG_KASHMIRI_INDIA: return "ks_IN"; } return "ks"; case LANG_KAZAK: return "kk_KZ"; case LANG_KONKANI: /* FIXME: Adjust this when such locales appear on Unix. */ return "kok_IN"; case LANG_KOREAN: return "ko_KR"; case LANG_LATVIAN: return "lv_LV"; case LANG_LITHUANIAN: return "lt_LT"; case LANG_MACEDONIAN: return "mk_MK"; case LANG_MALAY: switch (sub) { case SUBLANG_MALAY_MALAYSIA: return "ms_MY"; case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN"; } return "ms"; case LANG_MALAYALAM: return "ml_IN"; case LANG_MANIPURI: /* FIXME: Adjust this when such locales appear on Unix. */ return "mni_IN"; case LANG_MARATHI: return "mr_IN"; case LANG_NEPALI: switch (sub) { case SUBLANG_DEFAULT: return "ne_NP"; case SUBLANG_NEPALI_INDIA: return "ne_IN"; } return "ne"; case LANG_NORWEGIAN: switch (sub) { case SUBLANG_NORWEGIAN_BOKMAL: return "no_NO"; case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO"; } return "no"; case LANG_ORIYA: return "or_IN"; case LANG_POLISH: return "pl_PL"; case LANG_PORTUGUESE: switch (sub) { case SUBLANG_PORTUGUESE: return "pt_PT"; /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT. Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */ case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR"; } return "pt"; case LANG_PUNJABI: return "pa_IN"; case LANG_ROMANIAN: return "ro_RO"; case LANG_RUSSIAN: return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA". */ case LANG_SANSKRIT: return "sa_IN"; case LANG_SINDHI: return "sd"; case LANG_SLOVAK: return "sk_SK"; case LANG_SLOVENIAN: return "sl_SI"; case LANG_SORBIAN: /* FIXME: Adjust this when such locales appear on Unix. */ return "wen_DE"; case LANG_SPANISH: switch (sub) { case SUBLANG_SPANISH: return "es_ES"; case SUBLANG_SPANISH_MEXICAN: return "es_MX"; case SUBLANG_SPANISH_MODERN: return "es_ES@modern"; /* not seen on Unix */ case SUBLANG_SPANISH_GUATEMALA: return "es_GT"; case SUBLANG_SPANISH_COSTA_RICA: return "es_CR"; case SUBLANG_SPANISH_PANAMA: return "es_PA"; case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO"; case SUBLANG_SPANISH_VENEZUELA: return "es_VE"; case SUBLANG_SPANISH_COLOMBIA: return "es_CO"; case SUBLANG_SPANISH_PERU: return "es_PE"; case SUBLANG_SPANISH_ARGENTINA: return "es_AR"; case SUBLANG_SPANISH_ECUADOR: return "es_EC"; case SUBLANG_SPANISH_CHILE: return "es_CL"; case SUBLANG_SPANISH_URUGUAY: return "es_UY"; case SUBLANG_SPANISH_PARAGUAY: return "es_PY"; case SUBLANG_SPANISH_BOLIVIA: return "es_BO"; case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV"; case SUBLANG_SPANISH_HONDURAS: return "es_HN"; case SUBLANG_SPANISH_NICARAGUA: return "es_NI"; case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR"; } return "es"; case LANG_SWAHILI: return "sw"; case LANG_SWEDISH: switch (sub) { case SUBLANG_DEFAULT: return "sv_SE"; case SUBLANG_SWEDISH_FINLAND: return "sv_FI"; } return "sv"; case LANG_TAMIL: return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */ case LANG_TATAR: return "tt"; case LANG_TELUGU: return "te_IN"; case LANG_THAI: return "th_TH"; case LANG_TURKISH: return "tr_TR"; case LANG_UKRAINIAN: return "uk_UA"; case LANG_URDU: switch (sub) { case SUBLANG_URDU_PAKISTAN: return "ur_PK"; case SUBLANG_URDU_INDIA: return "ur_IN"; } return "ur"; case LANG_UZBEK: switch (sub) { /* FIXME: Adjust this when Uzbek locales appear on Unix. */ case SUBLANG_UZBEK_LATIN: return "uz_UZ@latin"; case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic"; } return "uz"; case LANG_VIETNAMESE: return "vi_VN"; default: return "C"; } #endif } sed-3.62/intl/ngettext.c0000644000076600007660000000371710143704205012134 00000000000000/* Implementation of ngettext(3) function. Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef _LIBC # define __need_NULL # include #else # include /* Just for NULL. */ #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define NGETTEXT __ngettext # define DCNGETTEXT __dcngettext #else # define NGETTEXT ngettext__ # define DCNGETTEXT dcngettext__ #endif /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ char * NGETTEXT (msgid1, msgid2, n) const char *msgid1; const char *msgid2; unsigned long int n; { return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__ngettext, ngettext); #endif sed-3.62/intl/os2compat.c0000644000076600007660000000656710143704205012207 00000000000000/* OS/2 compatibility functions. Copyright (C) 2001-2002 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define OS2_AWARE #ifdef HAVE_CONFIG_H #include #endif #include #include /* A version of getenv() that works from DLLs */ extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue); char * _nl_getenv (const char *name) { unsigned char *value; if (DosScanEnv (name, &value)) return NULL; else return value; } char _nl_default_dirname[] = /* a 260+1 bytes large buffer */ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0" #define LOCALEDIR_MAX 260 char *_os2_libdir = NULL; char *_os2_localealiaspath = NULL; char *_os2_localedir = NULL; static __attribute__((constructor)) void os2_initialize () { char *root = getenv ("UNIXROOT"); char *gnulocaledir = getenv ("GNULOCALEDIR"); _os2_libdir = gnulocaledir; if (!_os2_libdir) { if (root) { size_t sl = strlen (root); _os2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1); memcpy (_os2_libdir, root, sl); memcpy (_os2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1); } else _os2_libdir = LIBDIR; } _os2_localealiaspath = gnulocaledir; if (!_os2_localealiaspath) { if (root) { size_t sl = strlen (root); _os2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1); memcpy (_os2_localealiaspath, root, sl); memcpy (_os2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1); } else _os2_localealiaspath = LOCALE_ALIAS_PATH; } _os2_localedir = gnulocaledir; if (!_os2_localedir) { if (root) { size_t sl = strlen (root); _os2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1); memcpy (_os2_localedir, root, sl); memcpy (_os2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1); } else _os2_localedir = LOCALEDIR; } { extern const char _nl_default_dirname__[]; if (strlen (_os2_localedir) <= LOCALEDIR_MAX) strcpy (_nl_default_dirname__, _os2_localedir); } } sed-3.62/intl/os2compat.h0000644000076600007660000000300610143704205012175 00000000000000/* OS/2 compatibility defines. This file is intended to be included from config.h Copyright (C) 2001-2002 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* When included from os2compat.h we need all the original definitions */ #ifndef OS2_AWARE #undef LIBDIR #define LIBDIR _os2_libdir extern char *_os2_libdir; #undef LOCALEDIR #define LOCALEDIR _os2_localedir extern char *_os2_localedir; #undef LOCALE_ALIAS_PATH #define LOCALE_ALIAS_PATH _os2_localealiaspath extern char *_os2_localealiaspath; #endif #undef HAVE_STRCASECMP #define HAVE_STRCASECMP 1 #define strcasecmp stricmp #define strncasecmp strnicmp /* We have our own getenv() which works even if library is compiled as DLL */ #define getenv _nl_getenv /* Older versions of gettext used -1 as the value of LC_MESSAGES */ #define LC_MESSAGES_COMPAT (-1) sed-3.62/intl/osdep.c0000644000076600007660000000164310143704205011400 00000000000000/* OS dependent parts of libintl. Copyright (C) 2001-2002 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #if defined __EMX__ # include "os2compat.c" #else /* Avoid AIX compiler warning. */ typedef int dummy; #endif sed-3.62/intl/plural-exp.c0000644000076600007660000000771410143704206012365 00000000000000/* Expression parsing for plural form selection. Copyright (C) 2000, 2001 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "plural-exp.h" #if (defined __GNUC__ && !defined __APPLE_CC__) \ || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) /* These structs are the constant expression for the germanic plural form determination. It represents the expression "n != 1". */ static const struct expression plvar = { .nargs = 0, .operation = var, }; static const struct expression plone = { .nargs = 0, .operation = num, .val = { .num = 1 } }; struct expression GERMANIC_PLURAL = { .nargs = 2, .operation = not_equal, .val = { .args = { [0] = (struct expression *) &plvar, [1] = (struct expression *) &plone } } }; # define INIT_GERMANIC_PLURAL() #else /* For compilers without support for ISO C 99 struct/union initializers: Initialization at run-time. */ static struct expression plvar; static struct expression plone; struct expression GERMANIC_PLURAL; static void init_germanic_plural () { if (plone.val.num == 0) { plvar.nargs = 0; plvar.operation = var; plone.nargs = 0; plone.operation = num; plone.val.num = 1; GERMANIC_PLURAL.nargs = 2; GERMANIC_PLURAL.operation = not_equal; GERMANIC_PLURAL.val.args[0] = &plvar; GERMANIC_PLURAL.val.args[1] = &plone; } } # define INIT_GERMANIC_PLURAL() init_germanic_plural () #endif void internal_function EXTRACT_PLURAL_EXPRESSION (nullentry, pluralp, npluralsp) const char *nullentry; struct expression **pluralp; unsigned long int *npluralsp; { if (nullentry != NULL) { const char *plural; const char *nplurals; plural = strstr (nullentry, "plural="); nplurals = strstr (nullentry, "nplurals="); if (plural == NULL || nplurals == NULL) goto no_plural; else { char *endp; unsigned long int n; struct parse_args args; /* First get the number. */ nplurals += 9; while (*nplurals != '\0' && isspace ((unsigned char) *nplurals)) ++nplurals; if (!(*nplurals >= '0' && *nplurals <= '9')) goto no_plural; #if defined HAVE_STRTOUL || defined _LIBC n = strtoul (nplurals, &endp, 10); #else for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++) n = n * 10 + (*endp - '0'); #endif if (nplurals == endp) goto no_plural; *npluralsp = n; /* Due to the restrictions bison imposes onto the interface of the scanner function we have to put the input string and the result passed up from the parser into the same structure which address is passed down to the parser. */ plural += 7; args.cp = plural; if (PLURAL_PARSE (&args) != 0) goto no_plural; *pluralp = args.res; } } else { /* By default we are using the Germanic form: singular form only for `one', the plural form otherwise. Yes, this is also what English is using since English is a Germanic language. */ no_plural: INIT_GERMANIC_PLURAL (); *pluralp = &GERMANIC_PLURAL; *npluralsp = 2; } } sed-3.62/intl/plural-exp.h0000644000076600007660000001013210143704206012356 00000000000000/* Expression parsing and evaluation for plural form selection. Copyright (C) 2000, 2001 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PLURAL_EXP_H #define _PLURAL_EXP_H #ifndef PARAMS # if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES # define PARAMS(args) args # else # define PARAMS(args) () # endif #endif #ifndef internal_function # define internal_function #endif /* This is the representation of the expressions to determine the plural form. */ struct expression { int nargs; /* Number of arguments. */ enum operator { /* Without arguments: */ var, /* The variable "n". */ num, /* Decimal number. */ /* Unary operators: */ lnot, /* Logical NOT. */ /* Binary operators: */ mult, /* Multiplication. */ divide, /* Division. */ module, /* Modulo operation. */ plus, /* Addition. */ minus, /* Subtraction. */ less_than, /* Comparison. */ greater_than, /* Comparison. */ less_or_equal, /* Comparison. */ greater_or_equal, /* Comparison. */ equal, /* Comparison for equality. */ not_equal, /* Comparison for inequality. */ land, /* Logical AND. */ lor, /* Logical OR. */ /* Ternary operators: */ qmop /* Question mark operator. */ } operation; union { unsigned long int num; /* Number value for `num'. */ struct expression *args[3]; /* Up to three arguments. */ } val; }; /* This is the data structure to pass information to the parser and get the result in a thread-safe way. */ struct parse_args { const char *cp; struct expression *res; }; /* Names for the libintl functions are a problem. This source code is used 1. in the GNU C Library library, 2. in the GNU libintl library, 3. in the GNU gettext tools. The function names in each situation must be different, to allow for binary incompatible changes in 'struct expression'. Furthermore, 1. in the GNU C Library library, the names have a __ prefix, 2.+3. in the GNU libintl library and in the GNU gettext tools, the names must follow ANSI C and not start with __. So we have to distinguish the three cases. */ #ifdef _LIBC # define FREE_EXPRESSION __gettext_free_exp # define PLURAL_PARSE __gettextparse # define GERMANIC_PLURAL __gettext_germanic_plural # define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural #elif defined (IN_LIBINTL) # define FREE_EXPRESSION gettext_free_exp__ # define PLURAL_PARSE gettextparse__ # define GERMANIC_PLURAL gettext_germanic_plural__ # define EXTRACT_PLURAL_EXPRESSION gettext_extract_plural__ #else # define FREE_EXPRESSION free_plural_expression # define PLURAL_PARSE parse_plural_expression # define GERMANIC_PLURAL germanic_plural # define EXTRACT_PLURAL_EXPRESSION extract_plural_expression #endif extern void FREE_EXPRESSION PARAMS ((struct expression *exp)) internal_function; extern int PLURAL_PARSE PARAMS ((void *arg)); extern struct expression GERMANIC_PLURAL; extern void EXTRACT_PLURAL_EXPRESSION PARAMS ((const char *nullentry, struct expression **pluralp, unsigned long int *npluralsp)) internal_function; #if !defined (_LIBC) && !defined (IN_LIBINTL) extern unsigned long int plural_eval PARAMS ((struct expression *pexp, unsigned long int n)); #endif #endif /* _PLURAL_EXP_H */ sed-3.62/intl/plural.c0000644000076600007660000007747010143704206011601 00000000000000 /* A Bison parser, made from plural.y by GNU Bison version 1.28 */ #define YYBISON 1 /* Identify Bison output. */ #define yyparse __gettextparse #define yylex __gettextlex #define yyerror __gettexterror #define yylval __gettextlval #define yychar __gettextchar #define yydebug __gettextdebug #define yynerrs __gettextnerrs #define EQUOP2 257 #define CMPOP2 258 #define ADDOP2 259 #define MULOP2 260 #define NUMBER 261 #line 1 "plural.y" /* Expression parsing for plural form selection. Copyright (C) 2000, 2001 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* The bison generated parser uses alloca. AIX 3 forces us to put this declaration at the beginning of the file. The declaration in bison's skeleton file comes too late. This must come before because may include arbitrary system headers. */ #if defined _AIX && !defined __GNUC__ #pragma alloca #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #include "plural-exp.h" /* The main function generated by the parser is called __gettextparse, but we want it to be called PLURAL_PARSE. */ #ifndef _LIBC # define __gettextparse PLURAL_PARSE #endif #define YYLEX_PARAM &((struct parse_args *) arg)->cp #define YYPARSE_PARAM arg #line 49 "plural.y" typedef union { unsigned long int num; enum operator op; struct expression *exp; } YYSTYPE; #line 55 "plural.y" /* Prototypes for local functions. */ static struct expression *new_exp PARAMS ((int nargs, enum operator op, struct expression * const *args)); static inline struct expression *new_exp_0 PARAMS ((enum operator op)); static inline struct expression *new_exp_1 PARAMS ((enum operator op, struct expression *right)); static struct expression *new_exp_2 PARAMS ((enum operator op, struct expression *left, struct expression *right)); static inline struct expression *new_exp_3 PARAMS ((enum operator op, struct expression *bexp, struct expression *tbranch, struct expression *fbranch)); static int yylex PARAMS ((YYSTYPE *lval, const char **pexp)); static void yyerror PARAMS ((const char *str)); /* Allocation of expressions. */ static struct expression * new_exp (nargs, op, args) int nargs; enum operator op; struct expression * const *args; { int i; struct expression *newp; /* If any of the argument could not be malloc'ed, just return NULL. */ for (i = nargs - 1; i >= 0; i--) if (args[i] == NULL) goto fail; /* Allocate a new expression. */ newp = (struct expression *) malloc (sizeof (*newp)); if (newp != NULL) { newp->nargs = nargs; newp->operation = op; for (i = nargs - 1; i >= 0; i--) newp->val.args[i] = args[i]; return newp; } fail: for (i = nargs - 1; i >= 0; i--) FREE_EXPRESSION (args[i]); return NULL; } static inline struct expression * new_exp_0 (op) enum operator op; { return new_exp (0, op, NULL); } static inline struct expression * new_exp_1 (op, right) enum operator op; struct expression *right; { struct expression *args[1]; args[0] = right; return new_exp (1, op, args); } static struct expression * new_exp_2 (op, left, right) enum operator op; struct expression *left; struct expression *right; { struct expression *args[2]; args[0] = left; args[1] = right; return new_exp (2, op, args); } static inline struct expression * new_exp_3 (op, bexp, tbranch, fbranch) enum operator op; struct expression *bexp; struct expression *tbranch; struct expression *fbranch; { struct expression *args[3]; args[0] = bexp; args[1] = tbranch; args[2] = fbranch; return new_exp (3, op, args); } #include #ifndef __cplusplus #ifndef __STDC__ #define const #endif #endif #define YYFINAL 27 #define YYFLAG -32768 #define YYNTBASE 16 #define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 5, 2, 14, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 6, 7, 8, 9, 11 }; #if YYDEBUG != 0 static const short yyprhs[] = { 0, 0, 2, 8, 12, 16, 20, 24, 28, 32, 35, 37, 39 }; static const short yyrhs[] = { 17, 0, 17, 3, 17, 12, 17, 0, 17, 4, 17, 0, 17, 5, 17, 0, 17, 6, 17, 0, 17, 7, 17, 0, 17, 8, 17, 0, 17, 9, 17, 0, 10, 17, 0, 13, 0, 11, 0, 14, 17, 15, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, 174, 182, 186, 190, 194, 198, 202, 206, 210, 214, 218, 223 }; #endif #if YYDEBUG != 0 || defined (YYERROR_VERBOSE) static const char * const yytname[] = { "$","error","$undefined.","'?'","'|'", "'&'","EQUOP2","CMPOP2","ADDOP2","MULOP2","'!'","NUMBER","':'","'n'","'('","')'", "start","exp", NULL }; #endif static const short yyr1[] = { 0, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17 }; static const short yyr2[] = { 0, 1, 5, 3, 3, 3, 3, 3, 3, 2, 1, 1, 3 }; static const short yydefact[] = { 0, 0, 11, 10, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 3, 4, 5, 6, 7, 8, 0, 2, 0, 0, 0 }; static const short yydefgoto[] = { 25, 5 }; static const short yypact[] = { -9, -9,-32768,-32768, -9, 34,-32768, 11, -9, -9, -9, -9, -9, -9, -9,-32768, 24, 39, 43, 16, 26, -3,-32768, -9, 34, 21, 53,-32768 }; static const short yypgoto[] = {-32768, -1 }; #define YYLAST 53 static const short yytable[] = { 6, 1, 2, 7, 3, 4, 14, 16, 17, 18, 19, 20, 21, 22, 8, 9, 10, 11, 12, 13, 14, 26, 24, 12, 13, 14, 15, 8, 9, 10, 11, 12, 13, 14, 13, 14, 23, 8, 9, 10, 11, 12, 13, 14, 10, 11, 12, 13, 14, 11, 12, 13, 14, 27 }; static const short yycheck[] = { 1, 10, 11, 4, 13, 14, 9, 8, 9, 10, 11, 12, 13, 14, 3, 4, 5, 6, 7, 8, 9, 0, 23, 7, 8, 9, 15, 3, 4, 5, 6, 7, 8, 9, 8, 9, 12, 3, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 6, 7, 8, 9, 0 }; #define YYPURE 1 /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/local/share/bison.simple" /* This file comes from bison-1.28. */ /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ #ifndef YYSTACK_USE_ALLOCA #ifdef alloca #define YYSTACK_USE_ALLOCA #else /* alloca not defined */ #ifdef __GNUC__ #define YYSTACK_USE_ALLOCA #define alloca __builtin_alloca #else /* not GNU C. */ #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) #define YYSTACK_USE_ALLOCA #include #else /* not sparc */ /* We think this test detects Watcom and Microsoft C. */ /* This used to test MSDOS, but that is a bad idea since that symbol is in the user namespace. */ #if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) #if 0 /* No need for malloc.h, which pollutes the namespace; instead, just don't use alloca. */ #include #endif #else /* not MSDOS, or __TURBOC__ */ #if defined(_AIX) /* I don't know what this was needed for, but it pollutes the namespace. So I turned it off. rms, 2 May 1997. */ /* #include */ #pragma alloca #define YYSTACK_USE_ALLOCA #else /* not MSDOS, or __TURBOC__, or _AIX */ #if 0 #ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, and on HPUX 10. Eventually we can turn this on. */ #define YYSTACK_USE_ALLOCA #define alloca __builtin_alloca #endif /* __hpux */ #endif #endif /* not _AIX */ #endif /* not MSDOS, or __TURBOC__ */ #endif /* not sparc */ #endif /* not GNU C */ #endif /* alloca not defined */ #endif /* YYSTACK_USE_ALLOCA not defined */ #ifdef YYSTACK_USE_ALLOCA #define YYSTACK_ALLOC alloca #else #define YYSTACK_ALLOC malloc #endif /* Note: there must be only one dollar sign in this file. It is replaced by the list of actions, each action as one case of the switch. */ #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrlab1 /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(token, value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { yychar = (token), yylval = (value); \ yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ { yyerror ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 #ifndef YYPURE #define YYLEX yylex() #endif #ifdef YYPURE #ifdef YYLSP_NEEDED #ifdef YYLEX_PARAM #define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) #else #define YYLEX yylex(&yylval, &yylloc) #endif #else /* not YYLSP_NEEDED */ #ifdef YYLEX_PARAM #define YYLEX yylex(&yylval, YYLEX_PARAM) #else #define YYLEX yylex(&yylval) #endif #endif /* not YYLSP_NEEDED */ #endif /* If nonreentrant, generate the variables here */ #ifndef YYPURE int yychar; /* the lookahead symbol */ YYSTYPE yylval; /* the semantic value of the */ /* lookahead symbol */ #ifdef YYLSP_NEEDED YYLTYPE yylloc; /* location data for the lookahead */ /* symbol */ #endif int yynerrs; /* number of parse errors so far */ #endif /* not YYPURE */ #if YYDEBUG != 0 int yydebug; /* nonzero means print parse trace */ /* Since this is uninitialized, it does not stop multiple parsers from coexisting. */ #endif /* YYINITDEPTH indicates the initial size of the parser's stacks */ #ifndef YYINITDEPTH #define YYINITDEPTH 200 #endif /* YYMAXDEPTH is the maximum size the stacks can grow to (effective only if the built-in stack extension method is used). */ #if YYMAXDEPTH == 0 #undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH #define YYMAXDEPTH 10000 #endif /* Define __yy_memcpy. Note that the size argument should be passed with type unsigned int, because that is what the non-GCC definitions require. With GCC, __builtin_memcpy takes an arg of type size_t, but it can handle unsigned int. */ #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) #else /* not GNU C or C++ */ #ifndef __cplusplus /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __yy_memcpy (to, from, count) char *to; char *from; unsigned int count; { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #else /* __cplusplus */ /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __yy_memcpy (char *to, char *from, unsigned int count) { register char *t = to; register char *f = from; register int i = count; while (i-- > 0) *t++ = *f++; } #endif #endif #line 217 "/usr/local/share/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. It should actually point to an object. Grammar actions can access the variable by casting it to the proper pointer type. */ #ifdef YYPARSE_PARAM #ifdef __cplusplus #define YYPARSE_PARAM_ARG void *YYPARSE_PARAM #define YYPARSE_PARAM_DECL #else /* not __cplusplus */ #define YYPARSE_PARAM_ARG YYPARSE_PARAM #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; #endif /* not __cplusplus */ #else /* not YYPARSE_PARAM */ #define YYPARSE_PARAM_ARG #define YYPARSE_PARAM_DECL #endif /* not YYPARSE_PARAM */ /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ #ifdef YYPARSE_PARAM int yyparse (void *); #else int yyparse (void); #endif #endif int yyparse(YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { register int yystate; register int yyn; register short *yyssp; register YYSTYPE *yyvsp; int yyerrstatus; /* number of tokens to shift before error messages enabled */ int yychar1 = 0; /* lookahead token as an internal (translated) token number */ short yyssa[YYINITDEPTH]; /* the state stack */ YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ short *yyss = yyssa; /* refer to the stacks thru separate pointers */ YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ #ifdef YYLSP_NEEDED YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ YYLTYPE *yyls = yylsa; YYLTYPE *yylsp; #define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) #else #define YYPOPSTACK (yyvsp--, yyssp--) #endif int yystacksize = YYINITDEPTH; int yyfree_stacks = 0; #ifdef YYPURE int yychar; YYSTYPE yylval; int yynerrs; #ifdef YYLSP_NEEDED YYLTYPE yylloc; #endif #endif YYSTYPE yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ int yylen; #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Starting parse\n"); #endif yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss - 1; yyvsp = yyvs; #ifdef YYLSP_NEEDED yylsp = yyls; #endif /* Push a new state, which is found in yystate . */ /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ yynewstate: *++yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { /* Give user a chance to reallocate the stack */ /* Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; short *yyss1 = yyss; #ifdef YYLSP_NEEDED YYLTYPE *yyls1 = yyls; #endif /* Get the current used size of the three stacks, in elements. */ int size = yyssp - yyss + 1; #ifdef yyoverflow /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ #ifdef YYLSP_NEEDED /* This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yyls1, size * sizeof (*yylsp), &yystacksize); #else yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yystacksize); #endif yyss = yyss1; yyvs = yyvs1; #ifdef YYLSP_NEEDED yyls = yyls1; #endif #else /* no yyoverflow */ /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) { yyerror("parser stack overflow"); if (yyfree_stacks) { free (yyss); free (yyvs); #ifdef YYLSP_NEEDED free (yyls); #endif } return 2; } yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; #ifndef YYSTACK_USE_ALLOCA yyfree_stacks = 1; #endif yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); __yy_memcpy ((char *)yyss, (char *)yyss1, size * (unsigned int) sizeof (*yyssp)); yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * (unsigned int) sizeof (*yyvsp)); #ifdef YYLSP_NEEDED yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); __yy_memcpy ((char *)yyls, (char *)yyls1, size * (unsigned int) sizeof (*yylsp)); #endif #endif /* no yyoverflow */ yyssp = yyss + size - 1; yyvsp = yyvs + size - 1; #ifdef YYLSP_NEEDED yylsp = yyls + size - 1; #endif #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Stack size increased to %d\n", yystacksize); #endif if (yyssp >= yyss + yystacksize - 1) YYABORT; } #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Entering state %d\n", yystate); #endif goto yybackup; yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* yyresume: */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yyn == YYFLAG) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (yychar == YYEMPTY) { #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Reading a token: "); #endif yychar = YYLEX; } /* Convert token to internal form (in yychar1) for indexing tables with */ if (yychar <= 0) /* This means end of input. */ { yychar1 = 0; yychar = YYEOF; /* Don't call YYLEX any more */ #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Now at end of input.\n"); #endif } else { yychar1 = YYTRANSLATE(yychar); #if YYDEBUG != 0 if (yydebug) { fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ #ifdef YYPRINT YYPRINT (stderr, yychar, yylval); #endif fprintf (stderr, ")\n"); } #endif } yyn += yychar1; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) goto yydefault; yyn = yytable[yyn]; /* yyn is what to do for this token type in this state. Negative => reduce, -yyn is rule number. Positive => shift, yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (yyn < 0) { if (yyn == YYFLAG) goto yyerrlab; yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); #endif /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; #ifdef YYLSP_NEEDED *++yylsp = yylloc; #endif /* count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; yystate = yyn; goto yynewstate; /* Do the default action for the current state. */ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; /* Do a reduction. yyn is the number of a rule to reduce with. */ yyreduce: yylen = yyr2[yyn]; if (yylen > 0) yyval = yyvsp[1-yylen]; /* implement default value of the action */ #if YYDEBUG != 0 if (yydebug) { int i; fprintf (stderr, "Reducing via rule %d (line %d), ", yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) fprintf (stderr, "%s ", yytname[yyrhs[i]]); fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif switch (yyn) { case 1: #line 175 "plural.y" { if (yyvsp[0].exp == NULL) YYABORT; ((struct parse_args *) arg)->res = yyvsp[0].exp; ; break;} case 2: #line 183 "plural.y" { yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp); ; break;} case 3: #line 187 "plural.y" { yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp); ; break;} case 4: #line 191 "plural.y" { yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp); ; break;} case 5: #line 195 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); ; break;} case 6: #line 199 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); ; break;} case 7: #line 203 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); ; break;} case 8: #line 207 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); ; break;} case 9: #line 211 "plural.y" { yyval.exp = new_exp_1 (lnot, yyvsp[0].exp); ; break;} case 10: #line 215 "plural.y" { yyval.exp = new_exp_0 (var); ; break;} case 11: #line 219 "plural.y" { if ((yyval.exp = new_exp_0 (num)) != NULL) yyval.exp->val.num = yyvsp[0].num; ; break;} case 12: #line 224 "plural.y" { yyval.exp = yyvsp[-1].exp; ; break;} } /* the action file gets copied in in place of this dollarsign */ #line 543 "/usr/local/share/bison.simple" yyvsp -= yylen; yyssp -= yylen; #ifdef YYLSP_NEEDED yylsp -= yylen; #endif #if YYDEBUG != 0 if (yydebug) { short *ssp1 = yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif *++yyvsp = yyval; #ifdef YYLSP_NEEDED yylsp++; if (yylen == 0) { yylsp->first_line = yylloc.first_line; yylsp->first_column = yylloc.first_column; yylsp->last_line = (yylsp-1)->last_line; yylsp->last_column = (yylsp-1)->last_column; yylsp->text = 0; } else { yylsp->last_line = (yylsp+yylen-1)->last_line; yylsp->last_column = (yylsp+yylen-1)->last_column; } #endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; yyerrlab: /* here on detecting error */ if (! yyerrstatus) /* If not already recovering from an error, report this error. */ { ++yynerrs; #ifdef YYERROR_VERBOSE yyn = yypact[yystate]; if (yyn > YYFLAG && yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) size += strlen(yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, yytname[x]); strcat(msg, "'"); count++; } } yyerror(msg); free(msg); } else yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ yyerror("parse error"); } goto yyerrlab1; yyerrlab1: /* here on error raised explicitly by an action */ if (yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (yychar == YYEOF) YYABORT; #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); #endif yychar = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ yyerrstatus = 3; /* Each real token shifted decrements this */ goto yyerrhandle; yyerrdefault: /* current state does not do anything special for the error token. */ #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (yyn) goto yydefault; #endif yyerrpop: /* pop the current state because it cannot handle the error token */ if (yyssp == yyss) YYABORT; yyvsp--; yystate = *--yyssp; #ifdef YYLSP_NEEDED yylsp--; #endif #if YYDEBUG != 0 if (yydebug) { short *ssp1 = yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif yyerrhandle: yyn = yypact[yystate]; if (yyn == YYFLAG) goto yyerrdefault; yyn += YYTERROR; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) goto yyerrdefault; yyn = yytable[yyn]; if (yyn < 0) { if (yyn == YYFLAG) goto yyerrpop; yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Shifting error token, "); #endif *++yyvsp = yylval; #ifdef YYLSP_NEEDED *++yylsp = yylloc; #endif yystate = yyn; goto yynewstate; yyacceptlab: /* YYACCEPT comes here. */ if (yyfree_stacks) { free (yyss); free (yyvs); #ifdef YYLSP_NEEDED free (yyls); #endif } return 0; yyabortlab: /* YYABORT comes here. */ if (yyfree_stacks) { free (yyss); free (yyvs); #ifdef YYLSP_NEEDED free (yyls); #endif } return 1; } #line 229 "plural.y" void internal_function FREE_EXPRESSION (exp) struct expression *exp; { if (exp == NULL) return; /* Handle the recursive case. */ switch (exp->nargs) { case 3: FREE_EXPRESSION (exp->val.args[2]); /* FALLTHROUGH */ case 2: FREE_EXPRESSION (exp->val.args[1]); /* FALLTHROUGH */ case 1: FREE_EXPRESSION (exp->val.args[0]); /* FALLTHROUGH */ default: break; } free (exp); } static int yylex (lval, pexp) YYSTYPE *lval; const char **pexp; { const char *exp = *pexp; int result; while (1) { if (exp[0] == '\0') { *pexp = exp; return YYEOF; } if (exp[0] != ' ' && exp[0] != '\t') break; ++exp; } result = *exp++; switch (result) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { unsigned long int n = result - '0'; while (exp[0] >= '0' && exp[0] <= '9') { n *= 10; n += exp[0] - '0'; ++exp; } lval->num = n; result = NUMBER; } break; case '=': if (exp[0] == '=') { ++exp; lval->op = equal; result = EQUOP2; } else result = YYERRCODE; break; case '!': if (exp[0] == '=') { ++exp; lval->op = not_equal; result = EQUOP2; } break; case '&': case '|': if (exp[0] == result) ++exp; else result = YYERRCODE; break; case '<': if (exp[0] == '=') { ++exp; lval->op = less_or_equal; } else lval->op = less_than; result = CMPOP2; break; case '>': if (exp[0] == '=') { ++exp; lval->op = greater_or_equal; } else lval->op = greater_than; result = CMPOP2; break; case '*': lval->op = mult; result = MULOP2; break; case '/': lval->op = divide; result = MULOP2; break; case '%': lval->op = module; result = MULOP2; break; case '+': lval->op = plus; result = ADDOP2; break; case '-': lval->op = minus; result = ADDOP2; break; case 'n': case '?': case ':': case '(': case ')': /* Nothing, just return the character. */ break; case ';': case '\n': case '\0': /* Be safe and let the user call this function again. */ --exp; result = YYEOF; break; default: result = YYERRCODE; #if YYDEBUG != 0 --exp; #endif break; } *pexp = exp; return result; } static void yyerror (str) const char *str; { /* Do nothing. We don't print error messages here. */ } sed-3.62/intl/plural.y0000644000076600007660000001773410143704206011624 00000000000000%{ /* Expression parsing for plural form selection. Copyright (C) 2000, 2001 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* The bison generated parser uses alloca. AIX 3 forces us to put this declaration at the beginning of the file. The declaration in bison's skeleton file comes too late. This must come before because may include arbitrary system headers. */ #if defined _AIX && !defined __GNUC__ #pragma alloca #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #include "plural-exp.h" /* The main function generated by the parser is called __gettextparse, but we want it to be called PLURAL_PARSE. */ #ifndef _LIBC # define __gettextparse PLURAL_PARSE #endif #define YYLEX_PARAM &((struct parse_args *) arg)->cp #define YYPARSE_PARAM arg %} %pure_parser %expect 7 %union { unsigned long int num; enum operator op; struct expression *exp; } %{ /* Prototypes for local functions. */ static struct expression *new_exp PARAMS ((int nargs, enum operator op, struct expression * const *args)); static inline struct expression *new_exp_0 PARAMS ((enum operator op)); static inline struct expression *new_exp_1 PARAMS ((enum operator op, struct expression *right)); static struct expression *new_exp_2 PARAMS ((enum operator op, struct expression *left, struct expression *right)); static inline struct expression *new_exp_3 PARAMS ((enum operator op, struct expression *bexp, struct expression *tbranch, struct expression *fbranch)); static int yylex PARAMS ((YYSTYPE *lval, const char **pexp)); static void yyerror PARAMS ((const char *str)); /* Allocation of expressions. */ static struct expression * new_exp (nargs, op, args) int nargs; enum operator op; struct expression * const *args; { int i; struct expression *newp; /* If any of the argument could not be malloc'ed, just return NULL. */ for (i = nargs - 1; i >= 0; i--) if (args[i] == NULL) goto fail; /* Allocate a new expression. */ newp = (struct expression *) malloc (sizeof (*newp)); if (newp != NULL) { newp->nargs = nargs; newp->operation = op; for (i = nargs - 1; i >= 0; i--) newp->val.args[i] = args[i]; return newp; } fail: for (i = nargs - 1; i >= 0; i--) FREE_EXPRESSION (args[i]); return NULL; } static inline struct expression * new_exp_0 (op) enum operator op; { return new_exp (0, op, NULL); } static inline struct expression * new_exp_1 (op, right) enum operator op; struct expression *right; { struct expression *args[1]; args[0] = right; return new_exp (1, op, args); } static struct expression * new_exp_2 (op, left, right) enum operator op; struct expression *left; struct expression *right; { struct expression *args[2]; args[0] = left; args[1] = right; return new_exp (2, op, args); } static inline struct expression * new_exp_3 (op, bexp, tbranch, fbranch) enum operator op; struct expression *bexp; struct expression *tbranch; struct expression *fbranch; { struct expression *args[3]; args[0] = bexp; args[1] = tbranch; args[2] = fbranch; return new_exp (3, op, args); } %} /* This declares that all operators have the same associativity and the precedence order as in C. See [Harbison, Steele: C, A Reference Manual]. There is no unary minus and no bitwise operators. Operators with the same syntactic behaviour have been merged into a single token, to save space in the array generated by bison. */ %right '?' /* ? */ %left '|' /* || */ %left '&' /* && */ %left EQUOP2 /* == != */ %left CMPOP2 /* < > <= >= */ %left ADDOP2 /* + - */ %left MULOP2 /* * / % */ %right '!' /* ! */ %token EQUOP2 CMPOP2 ADDOP2 MULOP2 %token NUMBER %type exp %% start: exp { if ($1 == NULL) YYABORT; ((struct parse_args *) arg)->res = $1; } ; exp: exp '?' exp ':' exp { $$ = new_exp_3 (qmop, $1, $3, $5); } | exp '|' exp { $$ = new_exp_2 (lor, $1, $3); } | exp '&' exp { $$ = new_exp_2 (land, $1, $3); } | exp EQUOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | exp CMPOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | exp ADDOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | exp MULOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | '!' exp { $$ = new_exp_1 (lnot, $2); } | 'n' { $$ = new_exp_0 (var); } | NUMBER { if (($$ = new_exp_0 (num)) != NULL) $$->val.num = $1; } | '(' exp ')' { $$ = $2; } ; %% void internal_function FREE_EXPRESSION (exp) struct expression *exp; { if (exp == NULL) return; /* Handle the recursive case. */ switch (exp->nargs) { case 3: FREE_EXPRESSION (exp->val.args[2]); /* FALLTHROUGH */ case 2: FREE_EXPRESSION (exp->val.args[1]); /* FALLTHROUGH */ case 1: FREE_EXPRESSION (exp->val.args[0]); /* FALLTHROUGH */ default: break; } free (exp); } static int yylex (lval, pexp) YYSTYPE *lval; const char **pexp; { const char *exp = *pexp; int result; while (1) { if (exp[0] == '\0') { *pexp = exp; return YYEOF; } if (exp[0] != ' ' && exp[0] != '\t') break; ++exp; } result = *exp++; switch (result) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { unsigned long int n = result - '0'; while (exp[0] >= '0' && exp[0] <= '9') { n *= 10; n += exp[0] - '0'; ++exp; } lval->num = n; result = NUMBER; } break; case '=': if (exp[0] == '=') { ++exp; lval->op = equal; result = EQUOP2; } else result = YYERRCODE; break; case '!': if (exp[0] == '=') { ++exp; lval->op = not_equal; result = EQUOP2; } break; case '&': case '|': if (exp[0] == result) ++exp; else result = YYERRCODE; break; case '<': if (exp[0] == '=') { ++exp; lval->op = less_or_equal; } else lval->op = less_than; result = CMPOP2; break; case '>': if (exp[0] == '=') { ++exp; lval->op = greater_or_equal; } else lval->op = greater_than; result = CMPOP2; break; case '*': lval->op = mult; result = MULOP2; break; case '/': lval->op = divide; result = MULOP2; break; case '%': lval->op = module; result = MULOP2; break; case '+': lval->op = plus; result = ADDOP2; break; case '-': lval->op = minus; result = ADDOP2; break; case 'n': case '?': case ':': case '(': case ')': /* Nothing, just return the character. */ break; case ';': case '\n': case '\0': /* Be safe and let the user call this function again. */ --exp; result = YYEOF; break; default: result = YYERRCODE; #if YYDEBUG != 0 --exp; #endif break; } *pexp = exp; return result; } static void yyerror (str) const char *str; { /* Do nothing. We don't print error messages here. */ } sed-3.62/intl/ref-add.sin0000644000076600007660000000210110143704206012126 00000000000000# Add this package to a list of references stored in a text file. # # Copyright (C) 2000 Free Software Foundation, Inc. # # This program 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, 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # # Written by Bruno Haible . # /^# Packages using this file: / { s/# Packages using this file:// ta :a s/ @PACKAGE@ / @PACKAGE@ / tb s/ $/ @PACKAGE@ / :b s/^/# Packages using this file:/ } sed-3.62/intl/ref-del.sin0000644000076600007660000000202410143704207012147 00000000000000# Remove this package from a list of references stored in a text file. # # Copyright (C) 2000 Free Software Foundation, Inc. # # This program 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, 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # # Written by Bruno Haible . # /^# Packages using this file: / { s/# Packages using this file:// s/ @PACKAGE@ / / s/^/# Packages using this file:/ } sed-3.62/intl/textdomain.c0000644000076600007660000001057710143704207012452 00000000000000/* Implementation of the textdomain(3) function. Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. This program 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, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include "gettextP.h" #ifdef _LIBC /* We have to handle multi-threaded applications. */ # include #else /* Provide dummy implementation if this is outside glibc. */ # define __libc_rwlock_define(CLASS, NAME) # define __libc_rwlock_wrlock(NAME) # define __libc_rwlock_unlock(NAME) #endif /* The internal variables in the standalone libintl.a must have different names than the internal variables in GNU libc, otherwise programs using libintl.a cannot be linked statically. */ #if !defined _LIBC # define _nl_default_default_domain _nl_default_default_domain__ # define _nl_current_default_domain _nl_current_default_domain__ #endif /* @@ end of prolog @@ */ /* Name of the default text domain. */ extern const char _nl_default_default_domain[]; /* Default text domain in which entries for gettext(3) are to be found. */ extern const char *_nl_current_default_domain; /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define TEXTDOMAIN __textdomain # ifndef strdup # define strdup(str) __strdup (str) # endif #else # define TEXTDOMAIN textdomain__ #endif /* Lock variable to protect the global data in the gettext implementation. */ __libc_rwlock_define (extern, _nl_state_lock) /* Set the current default message catalog to DOMAINNAME. If DOMAINNAME is null, return the current default. If DOMAINNAME is "", reset to the default of "messages". */ char * TEXTDOMAIN (domainname) const char *domainname; { char *new_domain; char *old_domain; /* A NULL pointer requests the current setting. */ if (domainname == NULL) return (char *) _nl_current_default_domain; __libc_rwlock_wrlock (_nl_state_lock); old_domain = (char *) _nl_current_default_domain; /* If domain name is the null string set to default domain "messages". */ if (domainname[0] == '\0' || strcmp (domainname, _nl_default_default_domain) == 0) { _nl_current_default_domain = _nl_default_default_domain; new_domain = (char *) _nl_current_default_domain; } else if (strcmp (domainname, old_domain) == 0) /* This can happen and people will use it to signal that some environment variable changed. */ new_domain = old_domain; else { /* If the following malloc fails `_nl_current_default_domain' will be NULL. This value will be returned and so signals we are out of core. */ #if defined _LIBC || defined HAVE_STRDUP new_domain = strdup (domainname); #else size_t len = strlen (domainname) + 1; new_domain = (char *) malloc (len); if (new_domain != NULL) memcpy (new_domain, domainname, len); #endif if (new_domain != NULL) _nl_current_default_domain = new_domain; } /* We use this possibility to signal a change of the loaded catalogs since this is most likely the case and there is no other easy we to do it. Do it only when the call was successful. */ if (new_domain != NULL) { ++_nl_msg_cat_cntr; if (old_domain != new_domain && old_domain != _nl_default_default_domain) free (old_domain); } __libc_rwlock_unlock (_nl_state_lock); return new_domain; } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__textdomain, textdomain); #endif sed-3.62/lib/0000777000076600007660000000000010202633237010004 500000000000000sed-3.62/lib/Makefile.am0000644000076600007660000000075010143133571011756 00000000000000## Process this file with automake to produce Makefile.in noinst_LIBRARIES = libsed.a noinst_HEADERS = getopt.h utils.h obstack.h strverscmp.h \ stdbool_.h libsed_a_SOURCES = getopt1.c getopt.c utils.c EXTRA_DIST = memmove.c strerror.c AM_CPPFLAGS = -I$(top_srcdir)/lib -I$(top_srcdir)/intl -I$(top_srcdir)/pcre \ -I$(top_srcdir) -I$(top_builddir)/lib -I$(top_builddir)/intl libsed_a_LIBADD = @LIBOBJS@ @ALLOCA@ libsed_a_DEPENDENCIES = $(libsed_a_LIBADD) DISTCLEANFILES = stdbool.h sed-3.62/lib/Makefile.in0000644000076600007660000003435610202173547012003 00000000000000# Makefile.in generated by automake 1.9.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(libsed_a_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/stdbool_.h alloca.c getline.c \ memchr.c memcmp.c memmove.c mkstemp.c obstack.c obstack.h \ snprintf.c strerror.c strverscmp.c ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/codeset.m4 \ $(top_srcdir)/config/getline.m4 \ $(top_srcdir)/config/gettext-ver.m4 \ $(top_srcdir)/config/gettext.m4 \ $(top_srcdir)/config/glibc21.m4 $(top_srcdir)/config/iconv.m4 \ $(top_srcdir)/config/lcmessage.m4 \ $(top_srcdir)/config/lib-ld.m4 \ $(top_srcdir)/config/lib-link.m4 \ $(top_srcdir)/config/lib-prefix.m4 \ $(top_srcdir)/config/progtest.m4 \ $(top_srcdir)/config/stdbool.m4 \ $(top_srcdir)/config/strverscmp.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = stdbool.h LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libsed_a_AR = $(AR) $(ARFLAGS) am_libsed_a_OBJECTS = getopt1.$(OBJEXT) getopt.$(OBJEXT) \ utils.$(OBJEXT) libsed_a_OBJECTS = $(am_libsed_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libsed_a_SOURCES) DIST_SOURCES = $(libsed_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HTML_FALSE = @BUILD_HTML_FALSE@ BUILD_HTML_TRUE = @BUILD_HTML_TRUE@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ HAVE__BOOL = @HAVE__BOOL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKEINFO_HTML_FALSE = @MAKEINFO_HTML_FALSE@ MAKEINFO_HTML_TRUE = @MAKEINFO_HTML_TRUE@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCREGREP = @PCREGREP@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED_FEATURE_VERSION = @SED_FEATURE_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TEXI2HTML = @TEXI2HTML@ TEXI2HTML_HTML_FALSE = @TEXI2HTML_HTML_FALSE@ TEXI2HTML_HTML_TRUE = @TEXI2HTML_HTML_TRUE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ noinst_LIBRARIES = libsed.a noinst_HEADERS = getopt.h utils.h obstack.h strverscmp.h \ stdbool_.h libsed_a_SOURCES = getopt1.c getopt.c utils.c EXTRA_DIST = memmove.c strerror.c AM_CPPFLAGS = -I$(top_srcdir)/lib -I$(top_srcdir)/intl -I$(top_srcdir)/pcre \ -I$(top_srcdir) -I$(top_builddir)/lib -I$(top_builddir)/intl libsed_a_LIBADD = @LIBOBJS@ @ALLOCA@ libsed_a_DEPENDENCIES = $(libsed_a_LIBADD) DISTCLEANFILES = stdbool.h all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits lib/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnits lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh stdbool.h: $(top_builddir)/config.status $(srcdir)/stdbool_.h cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libsed.a: $(libsed_a_OBJECTS) $(libsed_a_DEPENDENCIES) -rm -f libsed.a $(libsed_a_AR) libsed.a $(libsed_a_OBJECTS) $(libsed_a_LIBADD) $(RANLIB) libsed.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memchr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memcmp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memmove.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/mkstemp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/obstack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/snprintf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strerror.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strverscmp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: sed-3.62/lib/alloca.c0000644000076600007660000003363210143133571011326 00000000000000/* alloca.c -- allocate automatically reclaimed memory (Mostly) portable public-domain implementation -- D A Gwyn This implementation of the PWB library alloca function, which is used to allocate space off the run-time stack so that it is automatically reclaimed upon procedure exit, was inspired by discussions with J. Q. Johnson of Cornell. J.Otto Tennant contributed the Cray support. There are some preprocessor constants that can be defined when compiling for your specific system, for improved efficiency; however, the defaults should be okay. The general concept of this implementation is to keep track of all alloca-allocated blocks, and reclaim any that are found to be deeper in the stack than the current invocation. This heuristic does not reclaim storage as soon as it becomes invalid, but it will do so eventually. As a special case, alloca(0) reclaims storage without allocating any. It is a good idea to use alloca(0) in your main control loop, etc. to force garbage collection. */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef emacs #include "blockinput.h" #endif /* If compiling with GCC 2, this file's not needed. */ #if !defined (__GNUC__) || __GNUC__ < 2 /* If someone has defined alloca as a macro, there must be some other way alloca is supposed to work. */ #ifndef alloca #ifdef emacs #ifdef static /* actually, only want this if static is defined as "" -- this is for usg, in which emacs must undefine static in order to make unexec workable */ #ifndef STACK_DIRECTION you lose -- must know STACK_DIRECTION at compile-time #endif /* STACK_DIRECTION undefined */ #endif /* static */ #endif /* emacs */ /* If your stack is a linked list of frames, you have to provide an "address metric" ADDRESS_FUNCTION macro. */ #if defined (CRAY) && defined (CRAY_STACKSEG_END) long i00afunc (); #define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) #else #define ADDRESS_FUNCTION(arg) &(arg) #endif #if __STDC__ typedef void *pointer; #else typedef char *pointer; #endif #ifndef NULL #define NULL 0 #endif /* Different portions of Emacs need to call different versions of malloc. The Emacs executable needs alloca to call xmalloc, because ordinary malloc isn't protected from input signals. On the other hand, the utilities in lib-src need alloca to call malloc; some of them are very simple, and don't have an xmalloc routine. Non-Emacs programs expect this to call xmalloc. Callers below should use malloc. */ #ifndef emacs #define malloc xmalloc #endif extern pointer malloc (); /* Define STACK_DIRECTION if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #ifndef STACK_DIRECTION #define STACK_DIRECTION 0 /* Direction unknown. */ #endif #if STACK_DIRECTION != 0 #define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ #else /* STACK_DIRECTION == 0; need run-time code. */ static int stack_dir; /* 1 or -1 once known. */ #define STACK_DIR stack_dir static void find_stack_direction () { static char *addr = NULL; /* Address of first `dummy', once known. */ auto char dummy; /* To get stack address. */ if (addr == NULL) { /* Initial entry. */ addr = ADDRESS_FUNCTION (dummy); find_stack_direction (); /* Recurse once. */ } else { /* Second entry. */ if (ADDRESS_FUNCTION (dummy) > addr) stack_dir = 1; /* Stack grew upward. */ else stack_dir = -1; /* Stack grew downward. */ } } #endif /* STACK_DIRECTION == 0 */ /* An "alloca header" is used to: (a) chain together all alloca'ed blocks; (b) keep track of stack depth. It is very important that sizeof(header) agree with malloc alignment chunk size. The following default should work okay. */ #ifndef ALIGN_SIZE #define ALIGN_SIZE sizeof(double) #endif typedef union hdr { char align[ALIGN_SIZE]; /* To force sizeof(header). */ struct { union hdr *next; /* For chaining headers. */ char *deep; /* For stack depth measure. */ } h; } header; static header *last_alloca_header = NULL; /* -> last alloca header. */ /* Return a pointer to at least SIZE bytes of storage, which will be automatically reclaimed upon exit from the procedure that called alloca. Originally, this space was supposed to be taken from the current stack frame of the caller, but that method cannot be made to work for some implementations of C, for example under Gould's UTX/32. */ pointer alloca (size) unsigned size; { auto char probe; /* Probes stack depth: */ register char *depth = ADDRESS_FUNCTION (probe); #if STACK_DIRECTION == 0 if (STACK_DIR == 0) /* Unknown growth direction. */ find_stack_direction (); #endif /* Reclaim garbage, defined as all alloca'd storage that was allocated from deeper in the stack than currently. */ { register header *hp; /* Traverses linked list. */ #ifdef emacs BLOCK_INPUT; #endif for (hp = last_alloca_header; hp != NULL;) if ((STACK_DIR > 0 && hp->h.deep > depth) || (STACK_DIR < 0 && hp->h.deep < depth)) { register header *np = hp->h.next; free ((pointer) hp); /* Collect garbage. */ hp = np; /* -> next header. */ } else break; /* Rest are not deeper. */ last_alloca_header = hp; /* -> last valid storage. */ #ifdef emacs UNBLOCK_INPUT; #endif } if (size == 0) return NULL; /* No allocation required. */ /* Allocate combined header + user data storage. */ { register pointer new = malloc (sizeof (header) + size); /* Address of header. */ if (new == 0) abort(); ((header *) new)->h.next = last_alloca_header; ((header *) new)->h.deep = depth; last_alloca_header = (header *) new; /* User storage begins just after header. */ return (pointer) ((char *) new + sizeof (header)); } } #if defined (CRAY) && defined (CRAY_STACKSEG_END) #ifdef DEBUG_I00AFUNC #include #endif #ifndef CRAY_STACK #define CRAY_STACK #ifndef CRAY2 /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ struct stack_control_header { long shgrow:32; /* Number of times stack has grown. */ long shaseg:32; /* Size of increments to stack. */ long shhwm:32; /* High water mark of stack. */ long shsize:32; /* Current size of stack (all segments). */ }; /* The stack segment linkage control information occurs at the high-address end of a stack segment. (The stack grows from low addresses to high addresses.) The initial part of the stack segment linkage control information is 0200 (octal) words. This provides for register storage for the routine which overflows the stack. */ struct stack_segment_linkage { long ss[0200]; /* 0200 overflow words. */ long sssize:32; /* Number of words in this segment. */ long ssbase:32; /* Offset to stack base. */ long:32; long sspseg:32; /* Offset to linkage control of previous segment of stack. */ long:32; long sstcpt:32; /* Pointer to task common address block. */ long sscsnm; /* Private control structure number for microtasking. */ long ssusr1; /* Reserved for user. */ long ssusr2; /* Reserved for user. */ long sstpid; /* Process ID for pid based multi-tasking. */ long ssgvup; /* Pointer to multitasking thread giveup. */ long sscray[7]; /* Reserved for Cray Research. */ long ssa0; long ssa1; long ssa2; long ssa3; long ssa4; long ssa5; long ssa6; long ssa7; long sss0; long sss1; long sss2; long sss3; long sss4; long sss5; long sss6; long sss7; }; #else /* CRAY2 */ /* The following structure defines the vector of words returned by the STKSTAT library routine. */ struct stk_stat { long now; /* Current total stack size. */ long maxc; /* Amount of contiguous space which would be required to satisfy the maximum stack demand to date. */ long high_water; /* Stack high-water mark. */ long overflows; /* Number of stack overflow ($STKOFEN) calls. */ long hits; /* Number of internal buffer hits. */ long extends; /* Number of block extensions. */ long stko_mallocs; /* Block allocations by $STKOFEN. */ long underflows; /* Number of stack underflow calls ($STKRETN). */ long stko_free; /* Number of deallocations by $STKRETN. */ long stkm_free; /* Number of deallocations by $STKMRET. */ long segments; /* Current number of stack segments. */ long maxs; /* Maximum number of stack segments so far. */ long pad_size; /* Stack pad size. */ long current_address; /* Current stack segment address. */ long current_size; /* Current stack segment size. This number is actually corrupted by STKSTAT to include the fifteen word trailer area. */ long initial_address; /* Address of initial segment. */ long initial_size; /* Size of initial segment. */ }; /* The following structure describes the data structure which trails any stack segment. I think that the description in 'asdef' is out of date. I only describe the parts that I am sure about. */ struct stk_trailer { long this_address; /* Address of this block. */ long this_size; /* Size of this block (does not include this trailer). */ long unknown2; long unknown3; long link; /* Address of trailer block of previous segment. */ long unknown5; long unknown6; long unknown7; long unknown8; long unknown9; long unknown10; long unknown11; long unknown12; long unknown13; long unknown14; }; #endif /* CRAY2 */ #endif /* not CRAY_STACK */ #ifdef CRAY2 /* Determine a "stack measure" for an arbitrary ADDRESS. I doubt that "lint" will like this much. */ static long i00afunc (long *address) { struct stk_stat status; struct stk_trailer *trailer; long *block, size; long result = 0; /* We want to iterate through all of the segments. The first step is to get the stack status structure. We could do this more quickly and more directly, perhaps, by referencing the $LM00 common block, but I know that this works. */ STKSTAT (&status); /* Set up the iteration. */ trailer = (struct stk_trailer *) (status.current_address + status.current_size - 15); /* There must be at least one stack segment. Therefore it is a fatal error if "trailer" is null. */ if (trailer == 0) abort (); /* Discard segments that do not contain our argument address. */ while (trailer != 0) { block = (long *) trailer->this_address; size = trailer->this_size; if (block == 0 || size == 0) abort (); trailer = (struct stk_trailer *) trailer->link; if ((block <= address) && (address < (block + size))) break; } /* Set the result to the offset in this segment and add the sizes of all predecessor segments. */ result = address - block; if (trailer == 0) { return result; } do { if (trailer->this_size <= 0) abort (); result += trailer->this_size; trailer = (struct stk_trailer *) trailer->link; } while (trailer != 0); /* We are done. Note that if you present a bogus address (one not in any segment), you will get a different number back, formed from subtracting the address of the first block. This is probably not what you want. */ return (result); } #else /* not CRAY2 */ /* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. Determine the number of the cell within the stack, given the address of the cell. The purpose of this routine is to linearize, in some sense, stack addresses for alloca. */ static long i00afunc (long address) { long stkl = 0; long size, pseg, this_segment, stack; long result = 0; struct stack_segment_linkage *ssptr; /* Register B67 contains the address of the end of the current stack segment. If you (as a subprogram) store your registers on the stack and find that you are past the contents of B67, you have overflowed the segment. B67 also points to the stack segment linkage control area, which is what we are really interested in. */ stkl = CRAY_STACKSEG_END (); ssptr = (struct stack_segment_linkage *) stkl; /* If one subtracts 'size' from the end of the segment, one has the address of the first word of the segment. If this is not the first segment, 'pseg' will be nonzero. */ pseg = ssptr->sspseg; size = ssptr->sssize; this_segment = stkl - size; /* It is possible that calling this routine itself caused a stack overflow. Discard stack segments which do not contain the target address. */ while (!(this_segment <= address && address <= stkl)) { #ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); #endif if (pseg == 0) break; stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; this_segment = stkl - size; } result = address - this_segment; /* If you subtract pseg from the current end of the stack, you get the address of the previous stack segment's end. This seems a little convoluted to me, but I'll bet you save a cycle somewhere. */ while (pseg != 0) { #ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o\n", pseg, size); #endif stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; result += size; } return (result); } #endif /* not CRAY2 */ #endif /* CRAY */ #endif /* no alloca */ #endif /* not GCC version 2 */ sed-3.62/lib/getline.c0000644000076600007660000000432210143133571011514 00000000000000#ifdef HAVE_CONFIG_H #include "config.h" #endif #undef _GNU_SOURCE #include #include #ifdef HAVE_STRINGS_H # include #else # include #endif /* HAVE_STRINGS_H */ #ifdef HAVE_STDLIB_H # include #endif /* HAVE_STDLIB_H */ #ifdef HAVE_UNISTD_H # include #endif /* HAVE_UNISTD_H */ #include #include /* Read up to (and including) a '\n' from STREAM into *LINEPTR (and null-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *N characters of space. It is realloc'd as necessary. Returns the number of characters read (not including the null terminator), or -1 on error or EOF. */ size_t getline (lineptr, n, stream) char **lineptr; size_t *n; FILE *stream; { char *line, *p; long size, copy; if (lineptr == NULL || n == NULL) { errno = EINVAL; return (size_t) -1; } if (ferror (stream)) return (size_t) -1; /* Make sure we have a line buffer to start with. */ if (*lineptr == NULL || *n < 2) /* !seen and no buf yet need 2 chars. */ { #ifndef MAX_CANON #define MAX_CANON 256 #endif if (!*lineptr) line = (char *) malloc (MAX_CANON); else line = (char *) realloc (*lineptr, MAX_CANON); if (line == NULL) return (size_t) -1; *lineptr = line; *n = MAX_CANON; } line = *lineptr; size = *n; copy = size; p = line; while (1) { long len; while (--copy > 0) { register int c = getc (stream); if (c == EOF) goto lose; else if ((*p++ = c) == '\n') goto win; } /* Need to enlarge the line buffer. */ len = p - line; size *= 2; line = (char *) realloc (line, size); if (line == NULL) goto lose; *lineptr = line; *n = size; p = line + len; copy = size - len; } lose: if (p == *lineptr) return (size_t) -1; /* Return a partial line since we got an error in the middle. */ win: #if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(MSDOS) || defined(__EMX__) if (p - 2 >= *lineptr && p[-2] == '\r') p[-2] = p[-1], --p; #endif *p = '\0'; return p - *lineptr; } sed-3.62/lib/getopt.c0000644000076600007660000007260110143133571011374 00000000000000/* 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 drepper@gnu.org before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98 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@gnu.org. 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #ifdef HAVE_CONFIG_H # include #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ # ifndef const # define const # endif #endif #include /* 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. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 # include # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #ifdef VMS # include # if HAVE_STRING_H - 0 # include # endif #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. When compiling libc, the _ macro is predefined. */ # ifdef HAVE_LIBINTL_H # include # define _(msgid) gettext (msgid) # else # define _(msgid) (msgid) # endif #endif /* 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 = NULL; /* 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 -1, 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. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized = 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 -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #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 # define my_index strchr #else /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif #ifndef strncmp extern int strncmp (); #endif static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ # if (!defined __STDC__ || !__STDC__) && !defined strlen /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); # endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_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; #ifdef _LIBC /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; static int original_argc; static char *const *original_argv; /* Make sure the environment variable bash 2.0 puts in the environment is valid for the getopt call we must make sure that the ARGV passed to getopt is that one passed to the process. */ static void __attribute__ ((unused)) store_args_and_env (int argc, char *const *argv) { /* XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ original_argc = argc; original_argv = argv; } # ifdef text_set_element text_set_element (__libc_subinit, store_args_and_env); # endif /* text_set_element */ # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* 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. */ #if defined __STDC__ && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #ifdef _LIBC /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len), '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined __STDC__ && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* 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. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* 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 (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #ifdef _LIBC if (posixly_correct == NULL && argc == original_argc && argv == original_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', nonoption_flags_max_len - len); } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* 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 -1. 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; { optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #ifdef _LIBC # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; 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; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The 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 -1; } /* 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 (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) 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 or later 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++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 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); optopt = pfound->val; 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); optopt = pfound->val; 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] == '-' || 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++; optopt = 0; return '?'; } } /* Look at and handle the next short 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 (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* 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) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - 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 or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[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; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; 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) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } 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 /* Not ELIDE_CODE. */ #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 == -1) 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 */ sed-3.62/lib/getopt.h0000644000076600007660000001075710143133571011405 00000000000000/* Declarations for getopt. Copyright (C) 1989,90,91,92,93,94,96,97 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@gnu.org. 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 -1, 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 defined (__STDC__) && __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 defined (__STDC__) && __STDC__ #ifdef __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 /* __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 /* __STDC__ */ #ifdef __cplusplus } #endif #endif /* getopt.h */ sed-3.62/lib/getopt1.c0000644000076600007660000001071210143133571011450 00000000000000/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 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@gnu.org. 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "getopt.h" #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* 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. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #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 /* Not ELIDE_CODE. */ #ifdef TEST #include 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 == -1) 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 */ sed-3.62/lib/memchr.c0000644000076600007660000001405110143133571011340 00000000000000/* Copyright (C) 1991, 1993, 1996, 1997 Free Software Foundation, Inc. Based on strlen implementation by Torbjorn Granlund (tege@sics.se), with help from Dan Sahlin (dan@sics.se) and commentary by Jim Blandy (jimb@ai.mit.edu); adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), and implemented by Roland McGrath (roland@ai.mit.edu). NOTE: The canonical source of this file is maintained with the GNU C Library. Bugs can be reported to bug-glibc@gnu.org. 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #undef __ptr_t #if defined (__cplusplus) || (defined (__STDC__) && __STDC__) # define __ptr_t void * #else /* Not C++ or ANSI C. */ # define __ptr_t char * #endif /* C++ or ANSI C. */ #if defined (_LIBC) # include #endif #if defined (HAVE_LIMITS_H) || defined (_LIBC) # include #endif #define LONG_MAX_32_BITS 2147483647 #ifndef LONG_MAX #define LONG_MAX LONG_MAX_32_BITS #endif #include #undef memchr /* Search no more than N bytes of S for C. */ __ptr_t memchr (s, c, n) const __ptr_t s; int c; size_t n; { const unsigned char *char_ptr; const unsigned long int *longword_ptr; unsigned long int longword, magic_bits, charmask; c = (unsigned char) c; /* Handle the first few characters by reading one character at a time. Do this until CHAR_PTR is aligned on a longword boundary. */ for (char_ptr = (const unsigned char *) s; n > 0 && ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0; --n, ++char_ptr) if (*char_ptr == c) return (__ptr_t) char_ptr; /* All these elucidatory comments refer to 4-byte longwords, but the theory applies equally well to 8-byte longwords. */ longword_ptr = (unsigned long int *) char_ptr; /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits the "holes." Note that there is a hole just to the left of each byte, with an extra at the end: bits: 01111110 11111110 11111110 11111111 bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD The 1-bits make sure that carries propagate to the next 0-bit. The 0-bits provide holes for carries to fall into. */ if (sizeof (longword) != 4 && sizeof (longword) != 8) abort (); #if LONG_MAX <= LONG_MAX_32_BITS magic_bits = 0x7efefeff; #else magic_bits = ((unsigned long int) 0x7efefefe << 32) | 0xfefefeff; #endif /* Set up a longword, each of whose bytes is C. */ charmask = c | (c << 8); charmask |= charmask << 16; #if LONG_MAX > LONG_MAX_32_BITS charmask |= charmask << 32; #endif /* Instead of the traditional loop which tests each character, we will test a longword at a time. The tricky part is testing if *any of the four* bytes in the longword in question are zero. */ while (n >= sizeof (longword)) { /* We tentatively exit the loop if adding MAGIC_BITS to LONGWORD fails to change any of the hole bits of LONGWORD. 1) Is this safe? Will it catch all the zero bytes? Suppose there is a byte with all zeros. Any carry bits propagating from its left will fall into the hole at its least significant bit and stop. Since there will be no carry from its most significant bit, the LSB of the byte to the left will be unchanged, and the zero will be detected. 2) Is this worthwhile? Will it ignore everything except zero bytes? Suppose every byte of LONGWORD has a bit set somewhere. There will be a carry into bit 8. If bit 8 is set, this will carry into bit 16. If bit 8 is clear, one of bits 9-15 must be set, so there will be a carry into bit 16. Similarly, there will be a carry into bit 24. If one of bits 24-30 is set, there will be a carry into bit 31, so all of the hole bits will be changed. The one misfire occurs when bits 24-30 are clear and bit 31 is set; in this case, the hole at bit 31 is not changed. If we had access to the processor carry flag, we could close this loophole by putting the fourth hole at bit 32! So it ignores everything except 128's, when they're aligned properly. 3) But wait! Aren't we looking for C, not zero? Good point. So what we do is XOR LONGWORD with a longword, each of whose bytes is C. This turns each byte that is C into a zero. */ longword = *longword_ptr++ ^ charmask; /* Add MAGIC_BITS to LONGWORD. */ if ((((longword + magic_bits) /* Set those bits that were unchanged by the addition. */ ^ ~longword) /* Look at only the hole bits. If any of the hole bits are unchanged, most likely one of the bytes was a zero. */ & ~magic_bits) != 0) { /* Which of the bytes was C? If none of them were, it was a misfire; continue the search. */ const unsigned char *cp = (const unsigned char *) (longword_ptr - 1); if (cp[0] == c) return (__ptr_t) cp; if (cp[1] == c) return (__ptr_t) &cp[1]; if (cp[2] == c) return (__ptr_t) &cp[2]; if (cp[3] == c) return (__ptr_t) &cp[3]; #if LONG_MAX > 2147483647 if (cp[4] == c) return (__ptr_t) &cp[4]; if (cp[5] == c) return (__ptr_t) &cp[5]; if (cp[6] == c) return (__ptr_t) &cp[6]; if (cp[7] == c) return (__ptr_t) &cp[7]; #endif } n -= sizeof (longword); } char_ptr = (const unsigned char *) longword_ptr; while (n-- > 0) { if (*char_ptr == c) return (__ptr_t) char_ptr; else ++char_ptr; } return 0; } sed-3.62/lib/memcmp.c0000644000076600007660000002237310143133571011351 00000000000000/* Copyright (C) 1991, 1993, 1995, 1997, 1998 Free Software Foundation, Inc. Contributed by Torbjorn Granlund (tege@sics.se). NOTE: The canonical source of this file is maintained with the GNU C Library. Bugs can be reported to bug-glibc@gnu.org. 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #undef __ptr_t #if defined __cplusplus || (defined __STDC__ && __STDC__) # define __ptr_t void * #else /* Not C++ or ANSI C. */ # undef const # define const # define __ptr_t char * #endif /* C++ or ANSI C. */ #ifndef __P # if defined __GNUC__ || (defined __STDC__ && __STDC__) # define __P(args) args # else # define __P(args) () # endif /* GCC. */ #endif /* Not __P. */ #if defined HAVE_STRING_H || defined _LIBC # include #endif #undef memcmp #ifdef _LIBC # include # include # if __BYTE_ORDER == __BIG_ENDIAN # define WORDS_BIGENDIAN # endif #else /* Not in the GNU C library. */ # include /* Type to use for aligned memory operations. This should normally be the biggest type supported by a single load and store. Must be an unsigned type. */ # define op_t unsigned long int # define OPSIZ (sizeof(op_t)) /* Threshold value for when to enter the unrolled loops. */ # define OP_T_THRES 16 /* Type to use for unaligned operations. */ typedef unsigned char byte; # ifndef WORDS_BIGENDIAN # define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2))) # else # define MERGE(w0, sh_1, w1, sh_2) (((w0) << (sh_1)) | ((w1) >> (sh_2))) # endif #endif /* In the GNU C library. */ #ifdef WORDS_BIGENDIAN # define CMP_LT_OR_GT(a, b) ((a) > (b) ? 1 : -1) #else # define CMP_LT_OR_GT(a, b) memcmp_bytes ((a), (b)) #endif /* BE VERY CAREFUL IF YOU CHANGE THIS CODE! */ /* The strategy of this memcmp is: 1. Compare bytes until one of the block pointers is aligned. 2. Compare using memcmp_common_alignment or memcmp_not_common_alignment, regarding the alignment of the other block after the initial byte operations. The maximum number of full words (of type op_t) are compared in this way. 3. Compare the few remaining bytes. */ #ifndef WORDS_BIGENDIAN /* memcmp_bytes -- Compare A and B bytewise in the byte order of the machine. A and B are known to be different. This is needed only on little-endian machines. */ static int memcmp_bytes __P((op_t, op_t)); # ifdef __GNUC__ __inline # endif static int memcmp_bytes (a, b) op_t a, b; { long int srcp1 = (long int) &a; long int srcp2 = (long int) &b; op_t a0, b0; do { a0 = ((byte *) srcp1)[0]; b0 = ((byte *) srcp2)[0]; srcp1 += 1; srcp2 += 1; } while (a0 == b0); return a0 - b0; } #endif static int memcmp_common_alignment __P((long, long, size_t)); /* memcmp_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN `op_t' objects (not LEN bytes!). Both SRCP1 and SRCP2 should be aligned for memory operations on `op_t's. */ #ifdef __GNUC__ __inline #endif static int memcmp_common_alignment (srcp1, srcp2, len) long int srcp1; long int srcp2; size_t len; { op_t a0, a1; op_t b0, b1; switch (len % 4) { default: /* Avoid warning about uninitialized local variables. */ case 2: a0 = ((op_t *) srcp1)[0]; b0 = ((op_t *) srcp2)[0]; srcp1 -= 2 * OPSIZ; srcp2 -= 2 * OPSIZ; len += 2; goto do1; case 3: a1 = ((op_t *) srcp1)[0]; b1 = ((op_t *) srcp2)[0]; srcp1 -= OPSIZ; srcp2 -= OPSIZ; len += 1; goto do2; case 0: if (OP_T_THRES <= 3 * OPSIZ && len == 0) return 0; a0 = ((op_t *) srcp1)[0]; b0 = ((op_t *) srcp2)[0]; goto do3; case 1: a1 = ((op_t *) srcp1)[0]; b1 = ((op_t *) srcp2)[0]; srcp1 += OPSIZ; srcp2 += OPSIZ; len -= 1; if (OP_T_THRES <= 3 * OPSIZ && len == 0) goto do0; /* Fall through. */ } do { a0 = ((op_t *) srcp1)[0]; b0 = ((op_t *) srcp2)[0]; if (a1 != b1) return CMP_LT_OR_GT (a1, b1); do3: a1 = ((op_t *) srcp1)[1]; b1 = ((op_t *) srcp2)[1]; if (a0 != b0) return CMP_LT_OR_GT (a0, b0); do2: a0 = ((op_t *) srcp1)[2]; b0 = ((op_t *) srcp2)[2]; if (a1 != b1) return CMP_LT_OR_GT (a1, b1); do1: a1 = ((op_t *) srcp1)[3]; b1 = ((op_t *) srcp2)[3]; if (a0 != b0) return CMP_LT_OR_GT (a0, b0); srcp1 += 4 * OPSIZ; srcp2 += 4 * OPSIZ; len -= 4; } while (len != 0); /* This is the right position for do0. Please don't move it into the loop. */ do0: if (a1 != b1) return CMP_LT_OR_GT (a1, b1); return 0; } static int memcmp_not_common_alignment __P((long, long, size_t)); /* memcmp_not_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN `op_t' objects (not LEN bytes!). SRCP2 should be aligned for memory operations on `op_t', but SRCP1 *should be unaligned*. */ #ifdef __GNUC__ __inline #endif static int memcmp_not_common_alignment (srcp1, srcp2, len) long int srcp1; long int srcp2; size_t len; { op_t a0, a1, a2, a3; op_t b0, b1, b2, b3; op_t x; int shl, shr; /* Calculate how to shift a word read at the memory operation aligned srcp1 to make it aligned for comparison. */ shl = 8 * (srcp1 % OPSIZ); shr = 8 * OPSIZ - shl; /* Make SRCP1 aligned by rounding it down to the beginning of the `op_t' it points in the middle of. */ srcp1 &= -OPSIZ; switch (len % 4) { default: /* Avoid warning about uninitialized local variables. */ case 2: a1 = ((op_t *) srcp1)[0]; a2 = ((op_t *) srcp1)[1]; b2 = ((op_t *) srcp2)[0]; srcp1 -= 1 * OPSIZ; srcp2 -= 2 * OPSIZ; len += 2; goto do1; case 3: a0 = ((op_t *) srcp1)[0]; a1 = ((op_t *) srcp1)[1]; b1 = ((op_t *) srcp2)[0]; srcp2 -= 1 * OPSIZ; len += 1; goto do2; case 0: if (OP_T_THRES <= 3 * OPSIZ && len == 0) return 0; a3 = ((op_t *) srcp1)[0]; a0 = ((op_t *) srcp1)[1]; b0 = ((op_t *) srcp2)[0]; srcp1 += 1 * OPSIZ; goto do3; case 1: a2 = ((op_t *) srcp1)[0]; a3 = ((op_t *) srcp1)[1]; b3 = ((op_t *) srcp2)[0]; srcp1 += 2 * OPSIZ; srcp2 += 1 * OPSIZ; len -= 1; if (OP_T_THRES <= 3 * OPSIZ && len == 0) goto do0; /* Fall through. */ } do { a0 = ((op_t *) srcp1)[0]; b0 = ((op_t *) srcp2)[0]; x = MERGE(a2, shl, a3, shr); if (x != b3) return CMP_LT_OR_GT (x, b3); do3: a1 = ((op_t *) srcp1)[1]; b1 = ((op_t *) srcp2)[1]; x = MERGE(a3, shl, a0, shr); if (x != b0) return CMP_LT_OR_GT (x, b0); do2: a2 = ((op_t *) srcp1)[2]; b2 = ((op_t *) srcp2)[2]; x = MERGE(a0, shl, a1, shr); if (x != b1) return CMP_LT_OR_GT (x, b1); do1: a3 = ((op_t *) srcp1)[3]; b3 = ((op_t *) srcp2)[3]; x = MERGE(a1, shl, a2, shr); if (x != b2) return CMP_LT_OR_GT (x, b2); srcp1 += 4 * OPSIZ; srcp2 += 4 * OPSIZ; len -= 4; } while (len != 0); /* This is the right position for do0. Please don't move it into the loop. */ do0: x = MERGE(a2, shl, a3, shr); if (x != b3) return CMP_LT_OR_GT (x, b3); return 0; } int memcmp (s1, s2, len) const __ptr_t s1; const __ptr_t s2; size_t len; { op_t a0; op_t b0; long int srcp1 = (long int) s1; long int srcp2 = (long int) s2; op_t res; if (len >= OP_T_THRES) { /* There are at least some bytes to compare. No need to test for LEN == 0 in this alignment loop. */ while (srcp2 % OPSIZ != 0) { a0 = ((byte *) srcp1)[0]; b0 = ((byte *) srcp2)[0]; srcp1 += 1; srcp2 += 1; res = a0 - b0; if (res != 0) return res; len -= 1; } /* SRCP2 is now aligned for memory operations on `op_t'. SRCP1 alignment determines if we can do a simple, aligned compare or need to shuffle bits. */ if (srcp1 % OPSIZ == 0) res = memcmp_common_alignment (srcp1, srcp2, len / OPSIZ); else res = memcmp_not_common_alignment (srcp1, srcp2, len / OPSIZ); if (res != 0) return res; /* Number of bytes remaining in the interval [0..OPSIZ-1]. */ srcp1 += len & -OPSIZ; srcp2 += len & -OPSIZ; len %= OPSIZ; } /* There are just a few bytes to compare. Use byte memory operations. */ while (len != 0) { a0 = ((byte *) srcp1)[0]; b0 = ((byte *) srcp2)[0]; srcp1 += 1; srcp2 += 1; res = a0 - b0; if (res != 0) return res; len -= 1; } return 0; } #ifdef weak_alias # undef bcmp weak_alias (memcmp, bcmp) #endif sed-3.62/lib/memmove.c0000644000076600007660000000365210143133571011537 00000000000000/* Copyright (C) 1998 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Last ditch effort to support memmove: if user doesn't have memmove or bcopy, we offer this sluggish implementation. */ #include "config.h" #ifndef HAVE_MEMMOVE #include #ifdef HAVE_MEMORY_H # include #endif #ifndef VOID # define VOID void #endif VOID * memmove(dest, src, len) VOID *dest; const VOID *src; size_t len; { #ifdef HAVE_BCOPY bcopy(src, dest, len); #else /*!HAVE_BCOPY*/ char *dp = dest; const char *sp = src; # ifdef HAVE_MEMCPY /* A special-case for non-overlapping regions, on the assumption that there is some hope that the sytem's memcpy() implementaion is better than our dumb fall-back one. */ if ((dp < sp && dp+len < sp) || (sp < dp && sp+len < dp)) return memcpy(dest, src, len); # endif /* I tried real hard to avoid getting to this point. You *really* ought to upgrade your system's libraries; the performance of this implementation sucks. */ if (dp < sp) { while (len-- > 0) *dp++ = *sp++; } else { if (dp == sp) return dest; dp += len; sp += len; while (len-- > 0) *--dp = *--sp; } #endif /*!HAVE_BCOPY*/ return dest; } #endif /*!HAVE_MEMMOVE*/ sed-3.62/lib/mkstemp.c0000644000076600007660000000247210143133571011551 00000000000000#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_STRINGS_H # include #else # include #endif /* HAVE_STRINGS_H */ #ifdef HAVE_STDLIB_H # include #endif /* HAVE_STDLIB_H */ #ifdef HAVE_SYS_FILE_H # include #endif /* HAVE_SYS_FILE_H */ #ifdef HAVE_IO_H # include #endif /* HAVE_IO_H */ #ifdef HAVE_UNISTD_H # include #endif /* HAVE_UNISTD_H */ #ifdef HAVE_FCNTL_H #include #endif /* HAVE_FCNTL_H */ #include #include /* Generate a unique temporary file name from template. The last six characters of template must be XXXXXX and these are replaced with a string that makes the filename unique. */ int mkstemp (template) char *template; { int i, j, n, fd; char *data = template + strlen(template) - 6; if (data < template) { errno = EINVAL; return -1; } for (n = 0; n <= 5; n++) if (data[n] != 'X') { errno = EINVAL; return -1; } for (i = 0; i < INT_MAX; i++) { j = i ^ 827714841; /* Base 36 DOSSUX :-) */ for (n = 5; n >= 0; n--) { data[n] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" [j % 36]; j /= 36; } fd = open (template, O_CREAT|O_EXCL|O_RDWR, 0600); if (fd != -1) return fd; } errno = EEXIST; return -1; } sed-3.62/lib/obstack.c0000644000076600007660000004144610143133571011523 00000000000000/* obstack.c - subroutines used implicitly by object stack macros -*- C -*- Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc. This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. The GNU C 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. The GNU C 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 the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "obstack.h" /* NOTE BEFORE MODIFYING THIS FILE: This version number must be incremented whenever callers compiled using an old obstack.h can no longer properly call the functions in this obstack.c. */ #define OBSTACK_INTERFACE_VERSION 1 /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself, and the installed library supports the same library interface we do. 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. */ #include /* Random thing to get __GNU_LIBRARY__. */ #if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1 #include #if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE #if defined (__STDC__) && __STDC__ #define POINTER void * #else #define POINTER char * #endif /* Determine default alignment. */ struct fooalign {char x; double d;}; #define DEFAULT_ALIGNMENT \ ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0)) /* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. But in fact it might be less smart and round addresses to as much as DEFAULT_ROUNDING. So we prepare for it to do that. */ union fooround {long x; double d;}; #define DEFAULT_ROUNDING (sizeof (union fooround)) #ifdef original_glibc_code /**//* When we copy a long block of data, this is the unit to do it with. */ /**//* On some machines, copying successive ints does not work; */ /**//* in such a case, redefine COPYING_UNIT to `long' (if that works) */ /**//* or `char' as a last resort. */ /**/#ifndef COPYING_UNIT /**/#define COPYING_UNIT int /**/#endif #endif /* The functions allocating more room by calling `obstack_chunk_alloc' jump to the handler pointed to by `obstack_alloc_failed_handler'. This variable by default points to the internal function `print_and_abort'. */ #if defined (__STDC__) && __STDC__ static void print_and_abort (void); void (*obstack_alloc_failed_handler) (void) = print_and_abort; #else static void print_and_abort (); void (*obstack_alloc_failed_handler) () = print_and_abort; #endif /* Exit value used when `print_and_abort' is used. */ #if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H #include #endif #ifndef EXIT_FAILURE #define EXIT_FAILURE 1 #endif int obstack_exit_failure = EXIT_FAILURE; /* The non-GNU-C macros copy the obstack into this global variable to avoid multiple evaluation. */ struct obstack *_obstack; /* Define a macro that either calls functions with the traditional malloc/free calling interface, or calls functions with the mmalloc/mfree interface (that adds an extra first argument), based on the state of use_extra_arg. For free, do not use ?:, since some compilers, like the MIPS compilers, do not allow (expr) ? void : void. */ #if defined (__STDC__) && __STDC__ #define CALL_CHUNKFUN(h, size) \ (((h) -> use_extra_arg) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size))) #define CALL_FREEFUN(h, old_chunk) \ do { \ if ((h) -> use_extra_arg) \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ else \ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \ } while (0) #else #define CALL_CHUNKFUN(h, size) \ (((h) -> use_extra_arg) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ : (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size))) #define CALL_FREEFUN(h, old_chunk) \ do { \ if ((h) -> use_extra_arg) \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ else \ (*(void (*) ()) (h)->freefun) ((old_chunk)); \ } while (0) #endif /* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). Objects start on multiples of ALIGNMENT (0 means use default). CHUNKFUN is the function to use to allocate chunks, and FREEFUN the function to free them. Return nonzero if successful, zero if out of memory. To recover from an out of memory error, free up some memory, then call this again. */ int _obstack_begin (h, size, alignment, chunkfun, freefun) struct obstack *h; int size; int alignment; #if defined (__STDC__) && __STDC__ POINTER (*chunkfun) (long); void (*freefun) (void *); #else POINTER (*chunkfun) (); void (*freefun) (); #endif { register struct _obstack_chunk *chunk; /* points to new chunk */ if (alignment == 0) alignment = DEFAULT_ALIGNMENT; if (size == 0) /* Default size is what GNU malloc can fit in a 4096-byte block. */ { /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. Use the values for range checking, because if range checking is off, the extra bytes won't be missed terribly, but if range checking is on and we used a larger request, a whole extra 4096 bytes would be allocated. These number are irrelevant to the new GNU malloc. I suspect it is less sensitive to the size of the request. */ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) + 4 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)); size = 4096 - extra; } #if defined (__STDC__) && __STDC__ h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; #else h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; h->freefun = freefun; #endif h->chunk_size = size; h->alignment_mask = alignment - 1; h->use_extra_arg = 0; chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); if (!chunk) (*obstack_alloc_failed_handler) (); h->next_free = h->object_base = chunk->contents; h->chunk_limit = chunk->limit = (char *) chunk + h->chunk_size; chunk->prev = 0; /* The initial chunk now contains no empty object. */ h->maybe_empty_object = 0; h->alloc_failed = 0; return 1; } int _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg) struct obstack *h; int size; int alignment; #if defined (__STDC__) && __STDC__ POINTER (*chunkfun) (POINTER, long); void (*freefun) (POINTER, POINTER); #else POINTER (*chunkfun) (); void (*freefun) (); #endif POINTER arg; { register struct _obstack_chunk *chunk; /* points to new chunk */ if (alignment == 0) alignment = DEFAULT_ALIGNMENT; if (size == 0) /* Default size is what GNU malloc can fit in a 4096-byte block. */ { /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. Use the values for range checking, because if range checking is off, the extra bytes won't be missed terribly, but if range checking is on and we used a larger request, a whole extra 4096 bytes would be allocated. These number are irrelevant to the new GNU malloc. I suspect it is less sensitive to the size of the request. */ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) + 4 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)); size = 4096 - extra; } #if defined(__STDC__) && __STDC__ h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; #else h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; h->freefun = freefun; #endif h->chunk_size = size; h->alignment_mask = alignment - 1; h->extra_arg = arg; h->use_extra_arg = 1; chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); if (!chunk) (*obstack_alloc_failed_handler) (); h->next_free = h->object_base = chunk->contents; h->chunk_limit = chunk->limit = (char *) chunk + h->chunk_size; chunk->prev = 0; /* The initial chunk now contains no empty object. */ h->maybe_empty_object = 0; h->alloc_failed = 0; return 1; } /* Allocate a new current chunk for the obstack *H on the assumption that LENGTH bytes need to be added to the current object, or a new object of length LENGTH allocated. Copies any partial object from the end of the old chunk to the beginning of the new one. */ void _obstack_newchunk (h, length) struct obstack *h; int length; { register struct _obstack_chunk *old_chunk = h->chunk; register struct _obstack_chunk *new_chunk; register long new_size; register int obj_size = h->next_free - h->object_base; /* Compute size for new chunk. */ new_size = (obj_size + length) + (obj_size >> 3) + 100; if (new_size < h->chunk_size) new_size = h->chunk_size; /* Allocate and initialize the new chunk. */ new_chunk = CALL_CHUNKFUN (h, new_size); if (!new_chunk) (*obstack_alloc_failed_handler) (); h->chunk = new_chunk; new_chunk->prev = old_chunk; new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; _obstack_memcpy(new_chunk->contents, h->object_base, obj_size); /* If the object just copied was the only data in OLD_CHUNK, */ /* free that chunk and remove it from the chain. */ /* But not if that chunk might contain an empty object. */ if (h->object_base == old_chunk->contents && ! h->maybe_empty_object) { new_chunk->prev = old_chunk->prev; CALL_FREEFUN (h, old_chunk); } h->object_base = new_chunk->contents; h->next_free = h->object_base + obj_size; /* The new chunk certainly contains no empty object yet. */ h->maybe_empty_object = 0; } /* Return nonzero if object OBJ has been allocated from obstack H. This is here for debugging. If you use it in a program, you are probably losing. */ #if defined (__STDC__) && __STDC__ /* Suppress -Wmissing-prototypes warning. We don't want to declare this in obstack.h because it is just for debugging. */ int _obstack_allocated_p (struct obstack *h, POINTER obj); #endif int _obstack_allocated_p (h, obj) struct obstack *h; POINTER obj; { register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ register struct _obstack_chunk *plp; /* point to previous chunk if any */ lp = (h)->chunk; /* We use >= rather than > since the object cannot be exactly at the beginning of the chunk but might be an empty object exactly at the end of an adjacent chunk. */ while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj)) { plp = lp->prev; lp = plp; } return lp != 0; } /* Free objects in obstack H, including OBJ and everything allocate more recently than OBJ. If OBJ is zero, free everything in H. */ #undef obstack_free /* This function has two names with identical definitions. This is the first one, called from non-ANSI code. */ void _obstack_free (h, obj) struct obstack *h; POINTER obj; { register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ register struct _obstack_chunk *plp; /* point to previous chunk if any */ lp = h->chunk; /* We use >= because there cannot be an object at the beginning of a chunk. But there can be an empty object at that address at the end of another chunk. */ while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj)) { plp = lp->prev; CALL_FREEFUN (h, lp); lp = plp; /* If we switch chunks, we can't tell whether the new current chunk contains an empty object, so assume that it may. */ h->maybe_empty_object = 1; } if (lp) { h->object_base = h->next_free = (char *) (obj); h->chunk_limit = lp->limit; h->chunk = lp; } else if (obj != 0) /* obj is not in any of the chunks! */ abort (); } /* This function is used from ANSI code. */ void obstack_free (h, obj) struct obstack *h; POINTER obj; { register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ register struct _obstack_chunk *plp; /* point to previous chunk if any */ lp = h->chunk; /* We use >= because there cannot be an object at the beginning of a chunk. But there can be an empty object at that address at the end of another chunk. */ while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj)) { plp = lp->prev; CALL_FREEFUN (h, lp); lp = plp; /* If we switch chunks, we can't tell whether the new current chunk contains an empty object, so assume that it may. */ h->maybe_empty_object = 1; } if (lp) { h->object_base = h->next_free = (char *) (obj); h->chunk_limit = lp->limit; h->chunk = lp; } else if (obj != 0) /* obj is not in any of the chunks! */ abort (); } int _obstack_memory_used (h) struct obstack *h; { register struct _obstack_chunk* lp; register int nbytes = 0; for (lp = h->chunk; lp != 0; lp = lp->prev) { nbytes += lp->limit - (char *) lp; } return nbytes; } /* Define the error handler. */ #ifndef _ # ifdef HAVE_LIBINTL_H # include # ifndef _ # define _(Str) gettext (Str) # endif # else # define _(Str) (Str) # endif #endif static void print_and_abort () { fputs (_("memory exhausted\n"), stderr); exit (obstack_exit_failure); } #if 0 /* These are now turned off because the applications do not use it and it uses bcopy via obstack_grow, which causes trouble on sysV. */ /* Now define the functional versions of the obstack macros. Define them to simply use the corresponding macros to do the job. */ #if defined (__STDC__) && __STDC__ /* These function definitions do not work with non-ANSI preprocessors; they won't pass through the macro names in parentheses. */ /* The function names appear in parentheses in order to prevent the macro-definitions of the names from being expanded there. */ POINTER (obstack_base) (obstack) struct obstack *obstack; { return obstack_base (obstack); } POINTER (obstack_next_free) (obstack) struct obstack *obstack; { return obstack_next_free (obstack); } int (obstack_object_size) (obstack) struct obstack *obstack; { return obstack_object_size (obstack); } int (obstack_room) (obstack) struct obstack *obstack; { return obstack_room (obstack); } int (obstack_make_room) (obstack, length) struct obstack *obstack; int length; { return obstack_make_room (obstack, length); } void (obstack_grow) (obstack, pointer, length) struct obstack *obstack; POINTER pointer; int length; { obstack_grow (obstack, pointer, length); } void (obstack_grow0) (obstack, pointer, length) struct obstack *obstack; POINTER pointer; int length; { obstack_grow0 (obstack, pointer, length); } void (obstack_1grow) (obstack, character) struct obstack *obstack; int character; { obstack_1grow (obstack, character); } void (obstack_blank) (obstack, length) struct obstack *obstack; int length; { obstack_blank (obstack, length); } void (obstack_1grow_fast) (obstack, character) struct obstack *obstack; int character; { obstack_1grow_fast (obstack, character); } void (obstack_blank_fast) (obstack, length) struct obstack *obstack; int length; { obstack_blank_fast (obstack, length); } POINTER (obstack_finish) (obstack) struct obstack *obstack; { return obstack_finish (obstack); } POINTER (obstack_alloc) (obstack, length) struct obstack *obstack; int length; { return obstack_alloc (obstack, length); } POINTER (obstack_copy) (obstack, pointer, length) struct obstack *obstack; POINTER pointer; int length; { return obstack_copy (obstack, pointer, length); } POINTER (obstack_copy0) (obstack, pointer, length) struct obstack *obstack; POINTER pointer; int length; { return obstack_copy0 (obstack, pointer, length); } #endif /* __STDC__ */ #endif /* 0 */ #endif /* !ELIDE_CODE */ sed-3.62/lib/obstack.h0000644000076600007660000005521710202143261011522 00000000000000/* obstack.h - object stack macros Copyright (C) 1988,89,90,91,92,93,94,96,97,98,99 Free Software Foundation, Inc. This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ /* Summary: All the apparent functions defined here are macros. The idea is that you would use these pre-tested macros to solve a very specific set of problems, and they would run fast. Caution: no side-effects in arguments please!! They may be evaluated MANY times!! These macros operate a stack of objects. Each object starts life small, and may grow to maturity. (Consider building a word syllable by syllable.) An object can move while it is growing. Once it has been "finished" it never changes address again. So the "top of the stack" is typically an immature growing object, while the rest of the stack is of mature, fixed size and fixed address objects. These routines grab large chunks of memory, using a function you supply, called `obstack_chunk_alloc'. On occasion, they free chunks, by calling `obstack_chunk_free'. You must define them and declare them before using any obstack macros. Each independent stack is represented by a `struct obstack'. Each of the obstack macros expects a pointer to such a structure as the first argument. One motivation for this package is the problem of growing char strings in symbol tables. Unless you are "fascist pig with a read-only mind" --Gosper's immortal quote from HAKMEM item 154, out of context--you would not like to put any arbitrary upper limit on the length of your symbols. In practice this often means you will build many short symbols and a few long symbols. At the time you are reading a symbol you don't know how long it is. One traditional method is to read a symbol into a buffer, realloc()ating the buffer every time you try to read a symbol that is longer than the buffer. This is beaut, but you still will want to copy the symbol from the buffer to a more permanent symbol-table entry say about half the time. With obstacks, you can work differently. Use one obstack for all symbol names. As you read a symbol, grow the name in the obstack gradually. When the name is complete, finalize it. Then, if the symbol exists already, free the newly read name. The way we do this is to take a large chunk, allocating memory from low addresses. When you want to build a symbol in the chunk you just add chars above the current "high water mark" in the chunk. When you have finished adding chars, because you got to the end of the symbol, you know how long the chars are, and you can create a new object. Mostly the chars will not burst over the highest address of the chunk, because you would typically expect a chunk to be (say) 100 times as long as an average object. In case that isn't clear, when we have enough chars to make up the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed) so we just point to it where it lies. No moving of chars is needed and this is the second win: potentially long strings need never be explicitly shuffled. Once an object is formed, it does not change its address during its lifetime. When the chars burst over a chunk boundary, we allocate a larger chunk, and then copy the partly formed object from the end of the old chunk to the beginning of the new larger chunk. We then carry on accreting characters to the end of the object as we normally would. A special macro is provided to add a single char at a time to a growing object. This allows the use of register variables, which break the ordinary 'growth' macro. Summary: We allocate large chunks. We carve out one object at a time from the current chunk. Once carved, an object never moves. We are free to append data of any size to the currently growing object. Exactly one object is growing in an obstack at any one time. You can run one obstack per control block. You may have as many control blocks as you dare. Because of the way we do it, you can `unwind' an obstack back to a previous state. (You may remove objects much as you would with a stack.) */ /* Don't do the contents of this file more than once. */ #ifndef _OBSTACK_H #define _OBSTACK_H 1 #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef __cplusplus extern "C" { #endif /* We use subtraction of (char *) 0 instead of casting to int because on word-addressable machines a simple cast to int may ignore the byte-within-word field of the pointer. */ #ifndef __PTR_TO_INT # define __PTR_TO_INT(P) ((P) - (char *) 0) #endif #ifndef __INT_TO_PTR # define __INT_TO_PTR(P) ((P) + (char *) 0) #endif /* We need the type of the resulting object. If __PTRDIFF_TYPE__ is defined, as with GNU C, use that; that way we don't pollute the namespace with 's symbols. Otherwise, if is available, include it and use ptrdiff_t. In traditional C, long is the best that we can do. */ #ifdef __PTRDIFF_TYPE__ # define PTR_INT_TYPE __PTRDIFF_TYPE__ #else # ifdef HAVE_STDDEF_H # include # define PTR_INT_TYPE ptrdiff_t # else # define PTR_INT_TYPE long # endif #endif #if defined _LIBC || defined HAVE_STRING_H # include # define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N)) #else # ifdef memcpy # define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N)) # else # define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N)) # endif #endif struct _obstack_chunk /* Lives at front of each chunk. */ { char *limit; /* 1 past end of this chunk */ struct _obstack_chunk *prev; /* address of prior chunk or NULL */ char contents[4]; /* objects begin here */ }; struct obstack /* control current object in current chunk */ { long chunk_size; /* preferred size to allocate chunks in */ struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */ char *object_base; /* address of object we are building */ char *next_free; /* where to add next char to current object */ char *chunk_limit; /* address of char after current chunk */ PTR_INT_TYPE temp; /* Temporary for some macros. */ int alignment_mask; /* Mask of alignment for each object. */ #if defined __STDC__ && __STDC__ /* These prototypes vary based on `use_extra_arg', and we use casts to the prototypeless function type in all assignments, but having prototypes here quiets -Wstrict-prototypes. */ struct _obstack_chunk *(*chunkfun) (void *, long); void (*freefun) (void *, struct _obstack_chunk *); void *extra_arg; /* first arg for chunk alloc/dealloc funcs */ #else struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk. */ void (*freefun) (); /* User's function to free a chunk. */ char *extra_arg; /* first arg for chunk alloc/dealloc funcs */ #endif unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ unsigned maybe_empty_object:1;/* There is a possibility that the current chunk contains a zero-length object. This prevents freeing the chunk if we allocate a bigger chunk to replace it. */ unsigned alloc_failed:1; /* No longer used, as we now call the failed handler on error, but retained for binary compatibility. */ }; /* Declare the external functions we use; they are in obstack.c. */ #if defined __STDC__ && __STDC__ extern void _obstack_newchunk (struct obstack *, int); extern void _obstack_free (struct obstack *, void *); extern int _obstack_begin (struct obstack *, int, int, void *(*) (long), void (*) (void *)); extern int _obstack_begin_1 (struct obstack *, int, int, void *(*) (void *, long), void (*) (void *, void *), void *); extern int _obstack_memory_used (struct obstack *); #else extern void _obstack_newchunk (); extern void _obstack_free (); extern int _obstack_begin (); extern int _obstack_begin_1 (); extern int _obstack_memory_used (); #endif #if defined __STDC__ && __STDC__ /* Do the function-declarations after the structs but before defining the macros. */ void obstack_init (struct obstack *obstack); void * obstack_alloc (struct obstack *obstack, int size); void * obstack_copy (struct obstack *obstack, const void *address, int size); void * obstack_copy0 (struct obstack *obstack, const void *address, int size); void obstack_free (struct obstack *obstack, void *block); void obstack_blank (struct obstack *obstack, int size); void obstack_grow (struct obstack *obstack, const void *data, int size); void obstack_grow0 (struct obstack *obstack, const void *data, int size); void obstack_1grow (struct obstack *obstack, int data_char); void obstack_ptr_grow (struct obstack *obstack, const void *data); void obstack_int_grow (struct obstack *obstack, int data); void * obstack_finish (struct obstack *obstack); int obstack_object_size (struct obstack *obstack); int obstack_room (struct obstack *obstack); void obstack_make_room (struct obstack *obstack, int size); void obstack_1grow_fast (struct obstack *obstack, int data_char); void obstack_ptr_grow_fast (struct obstack *obstack, const void *data); void obstack_int_grow_fast (struct obstack *obstack, int data); void obstack_blank_fast (struct obstack *obstack, int size); void * obstack_base (struct obstack *obstack); void * obstack_next_free (struct obstack *obstack); int obstack_alignment_mask (struct obstack *obstack); int obstack_chunk_size (struct obstack *obstack); int obstack_memory_used (struct obstack *obstack); #endif /* __STDC__ */ /* Non-ANSI C cannot really support alternative functions for these macros, so we do not declare them. */ /* Error handler called when `obstack_chunk_alloc' failed to allocate more memory. This can be set to a user defined function which should either abort gracefully or use longjump - but shouldn't return. The default action is to print a message and abort. */ #if defined __STDC__ && __STDC__ extern void (*obstack_alloc_failed_handler) (void); #else extern void (*obstack_alloc_failed_handler) (); #endif /* Exit value used when `print_and_abort' is used. */ extern int obstack_exit_failure; /* Pointer to beginning of object being allocated or to be allocated next. Note that this might not be the final address of the object because a new chunk might be needed to hold the final size. */ #define obstack_base(h) ((h)->object_base) /* Size for allocating ordinary chunks. */ #define obstack_chunk_size(h) ((h)->chunk_size) /* Pointer to next byte not yet allocated in current chunk. */ #define obstack_next_free(h) ((h)->next_free) /* Mask specifying low bits that should be clear in address of an object. */ #define obstack_alignment_mask(h) ((h)->alignment_mask) /* To prevent prototype warnings provide complete argument list in standard C version. */ #if defined __STDC__ && __STDC__ # define obstack_init(h) \ _obstack_begin ((h), 0, 0, \ (void *(*) (long)) obstack_chunk_alloc, \ (void (*) (void *)) obstack_chunk_free) # define obstack_begin(h, size) \ _obstack_begin ((h), (size), 0, \ (void *(*) (long)) obstack_chunk_alloc, \ (void (*) (void *)) obstack_chunk_free) # define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ _obstack_begin ((h), (size), (alignment), \ (void *(*) (long)) (chunkfun), \ (void (*) (void *)) (freefun)) # define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ _obstack_begin_1 ((h), (size), (alignment), \ (void *(*) (void *, long)) (chunkfun), \ (void (*) (void *, void *)) (freefun), (arg)) # define obstack_chunkfun(h, newchunkfun) \ ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun)) # define obstack_freefun(h, newfreefun) \ ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun)) #else # define obstack_init(h) \ _obstack_begin ((h), 0, 0, \ (void *(*) ()) obstack_chunk_alloc, \ (void (*) ()) obstack_chunk_free) # define obstack_begin(h, size) \ _obstack_begin ((h), (size), 0, \ (void *(*) ()) obstack_chunk_alloc, \ (void (*) ()) obstack_chunk_free) # define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ _obstack_begin ((h), (size), (alignment), \ (void *(*) ()) (chunkfun), \ (void (*) ()) (freefun)) # define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ _obstack_begin_1 ((h), (size), (alignment), \ (void *(*) ()) (chunkfun), \ (void (*) ()) (freefun), (arg)) # define obstack_chunkfun(h, newchunkfun) \ ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun)) # define obstack_freefun(h, newfreefun) \ ((h) -> freefun = (void (*)()) (newfreefun)) #endif #define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar) #define obstack_blank_fast(h,n) ((h)->next_free += (n)) #define obstack_memory_used(h) _obstack_memory_used (h) #if defined __GNUC__ && defined __STDC__ && __STDC__ /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and does not implement __extension__. But that compiler doesn't define __GNUC_MINOR__. */ # if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) # define __extension__ # endif /* For GNU C, if not -traditional, we can define these macros to compute all args only once without using a global variable. Also, we can avoid using the `temp' slot, to make faster code. */ # define obstack_object_size(OBSTACK) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ (unsigned) (__o->next_free - __o->object_base); }) # define obstack_room(OBSTACK) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ (unsigned) (__o->chunk_limit - __o->next_free); }) # define obstack_make_room(OBSTACK,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->chunk_limit - __o->next_free < __len) \ _obstack_newchunk (__o, __len); \ (void) 0; }) # define obstack_empty_p(OBSTACK) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); }) # define obstack_grow(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->next_free + __len > __o->chunk_limit) \ _obstack_newchunk (__o, __len); \ _obstack_memcpy (__o->next_free, (where), __len); \ __o->next_free += __len; \ (void) 0; }) # define obstack_grow0(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->next_free + __len + 1 > __o->chunk_limit) \ _obstack_newchunk (__o, __len + 1); \ _obstack_memcpy (__o->next_free, (where), __len); \ __o->next_free += __len; \ *(__o->next_free)++ = 0; \ (void) 0; }) # define obstack_1grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ if (__o->next_free + 1 > __o->chunk_limit) \ _obstack_newchunk (__o, 1); \ *(__o->next_free)++ = (datum); \ (void) 0; }) /* These assume that the obstack alignment is good enough for pointers or ints, and that the data added so far to the current object shares that much alignment. */ # define obstack_ptr_grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ _obstack_newchunk (__o, sizeof (void *)); \ ((*((void **)__o->next_free) = (datum)), (__o->next_free += sizeof (void *))); \ (void) 0; }) # define obstack_int_grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ if (__o->next_free + sizeof (int) > __o->chunk_limit) \ _obstack_newchunk (__o, sizeof (int)); \ ((*((int *)__o->next_free) = (datum)), (__o->next_free += sizeof (int ))); \ (void) 0; }) # define obstack_ptr_grow_fast(h,aptr) \ (((*((void **) (h)->next_free) = (aptr)), ( (h)->next_free += sizeof (void *)))) # define obstack_int_grow_fast(h,aint) \ (((*((int *) (h)->next_free) = (aint)), ( (h)->next_free += sizeof (int )))) # define obstack_blank(OBSTACK,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->chunk_limit - __o->next_free < __len) \ _obstack_newchunk (__o, __len); \ __o->next_free += __len; \ (void) 0; }) # define obstack_alloc(OBSTACK,length) \ __extension__ \ ({ struct obstack *__h = (OBSTACK); \ obstack_blank (__h, (length)); \ obstack_finish (__h); }) # define obstack_copy(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__h = (OBSTACK); \ obstack_grow (__h, (where), (length)); \ obstack_finish (__h); }) # define obstack_copy0(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__h = (OBSTACK); \ obstack_grow0 (__h, (where), (length)); \ obstack_finish (__h); }) /* The local variable is named __o1 to avoid a name conflict when obstack_blank is called. */ # define obstack_finish(OBSTACK) \ __extension__ \ ({ struct obstack *__o1 = (OBSTACK); \ void *value; \ value = (void *) __o1->object_base; \ if (__o1->next_free == value) \ __o1->maybe_empty_object = 1; \ __o1->next_free \ = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\ & ~ (__o1->alignment_mask)); \ if (__o1->next_free - (char *)__o1->chunk \ > __o1->chunk_limit - (char *)__o1->chunk) \ __o1->next_free = __o1->chunk_limit; \ __o1->object_base = __o1->next_free; \ value; }) # define obstack_free(OBSTACK, OBJ) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ void *__obj = (OBJ); \ if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \ __o->next_free = __o->object_base = (char *)__obj; \ else (obstack_free) (__o, __obj); }) #else /* not __GNUC__ or not __STDC__ */ # define obstack_object_size(h) \ (unsigned) ((h)->next_free - (h)->object_base) # define obstack_room(h) \ (unsigned) ((h)->chunk_limit - (h)->next_free) # define obstack_empty_p(h) \ ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0) /* Note that the call to _obstack_newchunk is enclosed in (..., 0) so that we can avoid having void expressions in the arms of the conditional expression. Casting the third operand to void was tried before, but some compilers won't accept it. */ # define obstack_make_room(h,length) \ ( (h)->temp = (length), \ (((h)->next_free + (h)->temp > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp), 0) : 0)) # define obstack_grow(h,where,length) \ ( (h)->temp = (length), \ (((h)->next_free + (h)->temp > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ _obstack_memcpy ((h)->next_free, (where), (h)->temp), \ (h)->next_free += (h)->temp) # define obstack_grow0(h,where,length) \ ( (h)->temp = (length), \ (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \ _obstack_memcpy ((h)->next_free, (where), (h)->temp), \ (h)->next_free += (h)->temp, \ *((h)->next_free)++ = 0) # define obstack_1grow(h,datum) \ ( (((h)->next_free + 1 > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), 1), 0) : 0), \ (*((h)->next_free)++ = (datum))) # define obstack_ptr_grow(h,datum) \ ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ (*((const char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = (datum))) # define obstack_int_grow(h,datum) \ ( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = (datum))) # define obstack_ptr_grow_fast(h,aptr) \ (((*((const char **) (h)->next_free) = (aptr)), ( (h)->next_free += sizeof (const char *)))) # define obstack_int_grow_fast(h,aint) \ (((*((int *) (h)->next_free) = (aint)), ( (h)->next_free += sizeof (int )))) # define obstack_blank(h,length) \ ( (h)->temp = (length), \ (((h)->chunk_limit - (h)->next_free < (h)->temp) \ ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ ((h)->next_free += (h)->temp)) # define obstack_alloc(h,length) \ (obstack_blank ((h), (length)), obstack_finish ((h))) # define obstack_copy(h,where,length) \ (obstack_grow ((h), (where), (length)), obstack_finish ((h))) # define obstack_copy0(h,where,length) \ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) # define obstack_finish(h) \ ( ((h)->next_free == (h)->object_base \ ? (((h)->maybe_empty_object = 1), 0) \ : 0), \ (h)->temp = __PTR_TO_INT ((h)->object_base), \ (h)->next_free \ = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \ & ~ ((h)->alignment_mask)), \ (((h)->next_free - (char *) (h)->chunk \ > (h)->chunk_limit - (char *) (h)->chunk) \ ? ((h)->next_free = (h)->chunk_limit) : 0), \ (h)->object_base = (h)->next_free, \ __INT_TO_PTR ((h)->temp)) # if defined __STDC__ && __STDC__ # define obstack_free(h,obj) \ ( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \ (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ ? (int) ((h)->next_free = (h)->object_base \ = (h)->temp + (char *) (h)->chunk) \ : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0))) # else # define obstack_free(h,obj) \ ( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \ (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ ? (int) ((h)->next_free = (h)->object_base \ = (h)->temp + (char *) (h)->chunk) \ : (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0))) # endif #endif /* not __GNUC__ or not __STDC__ */ #ifdef __cplusplus } /* C++ */ #endif #endif /* obstack.h */ sed-3.62/lib/snprintf.c0000644000076600007660000001265310143133571011736 00000000000000/* A simplified snprintf, without floating point support */ /* AIX requires this to be the first thing in the file. */ #ifdef _AIX #pragma alloca #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif #endif #ifndef BOOTSTRAP #include #endif #ifdef HAVE_STDARG_H #include #else #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #include #include "basicdefs.h" #define MINUS_FLAG 1 #define PLUS_FLAG 2 #define SPACE_FLAG 4 #define ALTERNATE_FLAG 8 #define ZERO_FLAG 16 static int compute_number_length (num, base, width, prec, flags, minusp) unsigned long num; unsigned base; int width; int prec; int flags; int minusp; { int len = 0; int i; /* length of the number itself */ do { len++; num /= base; } while (num); /* ...padded to prec characters */ if (prec > len) len = prec; /* ...with alternate prefix */ if (flags & ALTERNATE_FLAG && (base == 16 || base == 8)) len += base / 8; /* ...with the sign before it */ if (minusp || (flags & SPACE_FLAG) || (flags & PLUS_FLAG)) len++; /* ...and padded with spaces or zeroes (zeroes go before the sign, actually. This routine does not consider that but vsprintf will). */ return (width > len) ? width : len; } /* These can't be made into a function... */ #define PARSE_INT_FORMAT(res, args) \ if (long_flag) \ res = va_arg(args, long); \ else \ res = va_arg(args, int) #define PARSE_UINT_FORMAT(res, args) \ if (long_flag) \ res = va_arg(args, unsigned long); \ else \ res = va_arg(args, unsigned int) static int compute_length (fmt, args) const char *fmt; va_list args; { char c; const char *format; size_t sz; /* Go through the string and find the correct length. */ sz = 0; format = fmt; while (c = *format++) { if (c == '%') { int flags = 0; int width = 0; int prec = -1; int long_flag = 0; /* flags */ while ((c = *format++)) { if (c == '-') flags |= MINUS_FLAG; else if (c == '+') flags |= PLUS_FLAG; else if (c == ' ') flags |= SPACE_FLAG; else if (c == '#') flags |= ALTERNATE_FLAG; else if (c == '0') flags |= ZERO_FLAG; else break; } if (flags & PLUS_FLAG) flags &= ~SPACE_FLAG; if (flags & MINUS_FLAG) flags &= ~ZERO_FLAG; /* width */ if (isdigit (c)) do { width = width * 10 + c - '0'; c = *format++; } while (isdigit (c)); else if (c == '*') { width = va_arg (args, int); c = *format++; } /* precision */ if (c == '.') { prec = 0; c = *format++; if (isdigit (c)) do { prec = prec * 10 + c - '0'; c = *format++; } while (isdigit (c)); else if (c == '*') { prec = va_arg (args, int); c = *format++; } } /* size */ if (c == 'h') { c = *format++; if (c == 'h') c = *format++; } else if (c == 'l') { long_flag = 1; c = *format++; } switch (c) { case 'c': sz += width + 1; break; case 's': { int len; char *arg; arg = va_arg (args, char *); len = strlen (arg); if (prec != -1 && len > prec) len = prec; sz += (width > len) ? width : len; break; } case 'd': case 'i': { long arg; unsigned long num; int minusp = 0; PARSE_INT_FORMAT (arg, args); if (arg < 0) { minusp = 1; num = -arg; } else num = arg; sz += compute_number_length(num, 10, width, prec, flags, minusp); break; } case 'u': { unsigned long arg; PARSE_UINT_FORMAT (arg, args); sz += compute_number_length(arg, 10, width, prec, flags, 0); break; } case 'o': { unsigned long arg; PARSE_UINT_FORMAT (arg, args); sz += compute_number_length(arg, 8, width, prec, flags, 0); break; } case 'p': flags |= ALTERNATE_FLAG; /* fall through */ case 'x': case 'X': { unsigned long arg; PARSE_UINT_FORMAT (arg, args); sz += compute_number_length(arg, 16, width, prec, flags, 0); break; } case 'n': break; case '%': sz++; break; default: sz += 2; break; } } else sz++; } return sz; } static int my_vsnprintf (str, sz, fmt, args) char *str; size_t sz; const char *fmt; va_list args; { char *buf; size_t realsz = compute_length(fmt, args); /* Here, we have to count the null character at the end! */ if (realsz + 1 < sz) buf = alloca (realsz + 1); else buf = str; realsz = vsprintf(buf, fmt, args); if (buf != str) memcpy(str, buf, sz); return realsz; } int #ifdef HAVE_STDARG_H snprintf (char *str, size_t sz, const char *format,...) #else snprintf (va_alist) va_dcl #endif { va_list args; int ret; #ifdef HAVE_STDARG_H va_start (args, format); #else char *str; size_t sz; char *format; va_start (args); str = va_arg(args, char *); sz = va_arg(args, size_t); format = va_arg(args, char *); #endif ret = my_vsnprintf (str, sz, format, args); va_end (args); return ret; } sed-3.62/lib/stdbool_.h0000644000076600007660000000276410143133571011707 00000000000000/* Copyright (C) 2001-2002 Free Software Foundation, Inc. Written by Bruno Haible , 2001. 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _STDBOOL_H #define _STDBOOL_H /* ISO C 99 for platforms that lack it. */ /* 7.16. Boolean type and values */ /* BeOS already #defines false 0, true 1. We use the same definitions below, but temporarily we have to #undef them. */ #ifdef __BEOS__ # undef false # undef true #endif /* For the sake of symbolic names in gdb, define _Bool as an enum type. */ #ifndef __cplusplus # if !@HAVE__BOOL@ typedef enum { false = 0, true = 1 } _Bool; # endif #else typedef bool _Bool; #endif #define bool _Bool /* The other macros must be usable in preprocessor directives. */ #define false 0 #define true 1 #define __bool_true_false_are_defined 1 #endif /* _STDBOOL_H */ sed-3.62/lib/strerror.c0000644000076600007660000000277210143133571011756 00000000000000/* strerror -- return a string corresponding to an error number. This is a quickie version only intended as compatability glue for systems which predate the ANSI C definition of the function; the glibc version is recommended for more general use. Copyright (C) 1998 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" #ifndef HAVE_STRERROR # ifndef BOOTSTRAP # include # endif # ifdef HAVE_STRING_H # include # endif # include # undef strerror extern int sys_nerr; extern char *sys_errlist[]; char * strerror(e) int e; { static char unknown_string[] = "Unknown error code #xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; if (0<=e && e, 1997. The GNU C 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. The GNU C 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 the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #if HAVE_CONFIG_H # include #endif #include #include /* states: S_N: normal, S_I: comparing integral part, S_F: comparing fractional parts, S_Z: idem but with leading Zeroes only */ #define S_N 0x0 #define S_I 0x4 #define S_F 0x8 #define S_Z 0xC /* result_type: CMP: return diff; LEN: compare using len_diff/diff */ #define CMP 2 #define LEN 3 /* ISDIGIT differs from isdigit, as follows: - Its arg may be any int or unsigned int; it need not be an unsigned char. - It's guaranteed to evaluate its argument exactly once. - It's typically faster. POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to ISDIGIT_LOCALE unless it's important to use the locale's definition of `digit' even when the host does not conform to POSIX. */ #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) #undef __strverscmp #undef strverscmp #ifndef weak_alias # define __strverscmp strverscmp #endif /* Compare S1 and S2 as strings holding indices/version numbers, returning less than, equal to or greater than zero if S1 is less than, equal to or greater than S2 (for more info, see the texinfo doc). */ int __strverscmp (const char *s1, const char *s2) { const unsigned char *p1 = (const unsigned char *) s1; const unsigned char *p2 = (const unsigned char *) s2; unsigned char c1, c2; int state; int diff; /* Symbol(s) 0 [1-9] others (padding) Transition (10) 0 (01) d (00) x (11) - */ static const unsigned int next_state[] = { /* state x d 0 - */ /* S_N */ S_N, S_I, S_Z, S_N, /* S_I */ S_N, S_I, S_I, S_I, /* S_F */ S_N, S_F, S_F, S_F, /* S_Z */ S_N, S_F, S_Z, S_Z }; static const int result_type[] = { /* state x/x x/d x/0 x/- d/x d/d d/0 d/- 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */ /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, /* S_I */ CMP, -1, -1, CMP, 1, LEN, LEN, CMP, 1, LEN, LEN, CMP, CMP, CMP, CMP, CMP, /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, /* S_Z */ CMP, 1, 1, CMP, -1, CMP, CMP, CMP, -1, CMP, CMP, CMP }; if (p1 == p2) return 0; c1 = *p1++; c2 = *p2++; /* Hint: '0' is a digit too. */ state = S_N | ((c1 == '0') + (ISDIGIT (c1) != 0)); while ((diff = c1 - c2) == 0 && c1 != '\0') { state = next_state[state]; c1 = *p1++; c2 = *p2++; state |= (c1 == '0') + (ISDIGIT (c1) != 0); } state = result_type[state << 2 | ((c2 == '0') + (ISDIGIT (c2) != 0))]; switch (state) { case CMP: return diff; case LEN: while (ISDIGIT (*p1++)) if (!ISDIGIT (*p2++)) return 1; return ISDIGIT (*p2) ? -1 : diff; default: return state; } } #ifdef weak_alias weak_alias (__strverscmp, strverscmp) #endif sed-3.62/lib/strverscmp.h0000644000076600007660000000063010143133571012300 00000000000000/* strverscmp.h -- compare strings holding indices/version numbers */ #ifndef STRVERSCMP_H_ # define STRVERSCMP_H_ # if HAVE_CONFIG_H # include # endif # ifndef PARAMS # if defined PROTOTYPES || (defined __STDC__ && __STDC__) # define PARAMS(Args) Args # else # define PARAMS(Args) () # endif # endif int strverscmp PARAMS ((const char*, const char*)); #endif /* not STRVERSCMP_H_ */ sed-3.62/lib/utils.c0000644000076600007660000002354410143133571011234 00000000000000/* Functions from hack's utils library. Copyright (C) 1989, 1990, 1991, 1998, 1999, 2003 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #ifndef errno extern int errno; #endif #ifdef HAVE_STRINGS_H # include #else # include #endif /* HAVE_STRINGS_H */ #ifdef HAVE_STDLIB_H # include #endif /* HAVE_STDLIB_H */ #include "utils.h" const char *myname; /* Store information about files opened with ck_fopen so that error messages from ck_fread, ck_fwrite, etc. can print the name of the file that had the error */ struct open_file { FILE *fp; char *name; struct open_file *link; unsigned temp : 1; }; static struct open_file *open_files = NULL; static void do_ck_fclose P_((FILE *fp)); /* Print an error message and exit */ #if !defined __STDC__ || !(__STDC__-0) # include # define VSTART(l,a) va_start(l) void panic(str, va_alist) char *str; va_dcl #else /*__STDC__*/ # include # define VSTART(l,a) va_start(l, a) void panic(const char *str, ...) #endif /* __STDC__ */ { va_list iggy; fprintf(stderr, "%s: ", myname); VSTART(iggy, str); #ifndef HAVE_VPRINTF # ifndef HAVE_DOPRNT fputs(str, stderr); /* not great, but perhaps better than nothing... */ # else /* HAVE_DOPRNT */ _doprnt(str, &iggy, stderr); # endif /* HAVE_DOPRNT */ #else /* HAVE_VFPRINTF */ vfprintf(stderr, str, iggy); #endif /* HAVE_VFPRINTF */ va_end(iggy); putc('\n', stderr); /* Unlink the temporary files. */ while (open_files) { if (open_files->temp) { int fd = fileno (open_files->fp); fclose (open_files->fp); errno = 0; unlink (open_files->name); if (errno != 0) fprintf (stderr, _("cannot remove %s: %s"), open_files->name, strerror (errno)); } open_files = open_files->link; } exit(4); } /* Internal routine to get a filename from open_files */ static const char *utils_fp_name P_((FILE *fp)); static const char * utils_fp_name(fp) FILE *fp; { struct open_file *p; for (p=open_files; p; p=p->link) if (p->fp == fp) return p->name; if (fp == stdin) return "stdin"; else if (fp == stdout) return "stdout"; else if (fp == stderr) return "stderr"; return ""; } /* Panic on failing fopen */ FILE * ck_fopen(name, mode, fail) const char *name; const char *mode; bool fail; { FILE *fp; struct open_file *p; fp = fopen (name, mode); if (!fp) { if (fail) panic(_("couldn't open file %s: %s"), name, strerror(errno)); return NULL; } for (p=open_files; p; p=p->link) { if (fp == p->fp) { FREE(p->name); break; } } if (!p) { p = MALLOC(1, struct open_file); p->link = open_files; open_files = p; } p->name = ck_strdup(name); p->fp = fp; p->temp = false; return fp; } FILE * ck_mkstemp (p_filename, tmpdir, base) char **p_filename; char *base, *tmpdir; { char *template; FILE *fp; int fd; struct open_file *p; if (tmpdir == NULL) tmpdir = getenv("TMPDIR"); if (tmpdir == NULL) { tmpdir = getenv("TMP"); if (tmpdir == NULL) #ifdef P_tmpdir tmpdir = P_tmpdir; #else tmpdir = "/tmp"; #endif } template = xmalloc (strlen (tmpdir) + strlen (base) + 8); sprintf (template, "%s/%sXXXXXX", tmpdir, base); fd = mkstemp (template); if (fd == -1) panic(_("couldn't open temporary file %s: %s"), template, strerror(errno)); *p_filename = template; fp = fdopen (fd, "w"); p = MALLOC(1, struct open_file); p->name = ck_strdup (template); p->fp = fp; p->temp = true; p->link = open_files; open_files = p; return fp; } /* Panic on failing fwrite */ void ck_fwrite(ptr, size, nmemb, stream) const VOID *ptr; size_t size; size_t nmemb; FILE *stream; { clearerr(stream); if (size && fwrite(ptr, size, nmemb, stream) != nmemb) panic(ngettext("couldn't write %d item to %s: %s", "couldn't write %d items to %s: %s", nmemb), nmemb, utils_fp_name(stream), strerror(errno)); } /* Panic on failing fread */ size_t ck_fread(ptr, size, nmemb, stream) VOID *ptr; size_t size; size_t nmemb; FILE *stream; { clearerr(stream); if (size && (nmemb=fread(ptr, size, nmemb, stream)) <= 0 && ferror(stream)) panic(_("read error on %s: %s"), utils_fp_name(stream), strerror(errno)); return nmemb; } size_t ck_getline(text, buflen, stream) char **text; size_t *buflen; FILE *stream; { int result; if (!ferror (stream)) result = getline (text, buflen, stream); if (ferror (stream)) panic (_("read error on %s: %s"), utils_fp_name(stream), strerror(errno)); return result; } /* Panic on failing fflush */ void ck_fflush(stream) FILE *stream; { clearerr(stream); if (fflush(stream) == EOF && errno != EBADF) panic("couldn't flush %s: %s", utils_fp_name(stream), strerror(errno)); } /* Panic on failing fclose */ void ck_fclose(stream) FILE *stream; { struct open_file r; struct open_file *prev; struct open_file *cur; /* a NULL stream means to close all files */ r.link = open_files; prev = &r; while ( (cur = prev->link) ) { if (!stream || stream == cur->fp) { do_ck_fclose (cur->fp); prev->link = cur->link; FREE(cur->name); FREE(cur); } else prev = cur; } open_files = r.link; /* Also care about stdout, because if it is redirected the last output operations might fail and it is important to signal this as an error (perhaps to make). */ if (!stream) { do_ck_fclose (stdout); do_ck_fclose (stderr); } } /* Close a single file. */ void do_ck_fclose(fp) FILE *fp; { int fd; ck_fflush(fp); clearerr(fp); /* We want to execute both arms, so use | not ||. */ if (fclose(fp) == EOF) panic("couldn't close %s: %s", utils_fp_name(fp), strerror(errno)); } /* Panic on failing rename */ void ck_rename (from, to, unlink_if_fail) const char *from, *to; const char *unlink_if_fail; { int rd = rename (from, to); if (rd != -1) return; if (unlink_if_fail) { int save_errno = errno; errno = 0; unlink (unlink_if_fail); /* Failure to remove the temporary file is more severe, so trigger it first. */ if (errno != 0) panic (_("cannot remove %s: %s"), unlink_if_fail, strerror (errno)); errno = save_errno; } panic (_("cannot rename %s: %s"), from, strerror (errno)); } /* Panic on failing malloc */ VOID * ck_malloc(size) size_t size; { VOID *ret = calloc(1, size ? size : 1); if (!ret) panic("couldn't allocate memory"); return ret; } /* Panic on failing malloc */ VOID * xmalloc(size) size_t size; { return ck_malloc(size); } /* Panic on failing realloc */ VOID * ck_realloc(ptr, size) VOID *ptr; size_t size; { VOID *ret; if (size == 0) { FREE(ptr); return NULL; } if (!ptr) return ck_malloc(size); ret = realloc(ptr, size); if (!ret) panic("couldn't re-allocate memory"); return ret; } /* Return a malloc()'d copy of a string */ char * ck_strdup(str) const char *str; { char *ret = MALLOC(strlen(str)+1, char); return strcpy(ret, str); } /* Return a malloc()'d copy of a block of memory */ VOID * ck_memdup(buf, len) const VOID *buf; size_t len; { VOID *ret = ck_malloc(len); return memcpy(ret, buf, len); } /* Release a malloc'd block of memory */ void ck_free(ptr) VOID *ptr; { if (ptr) free(ptr); } /* Implement a variable sized buffer of `stuff'. We don't know what it is, nor do we care, as long as it doesn't mind being aligned by malloc. */ struct buffer { size_t allocated; size_t length; char *b; }; #define MIN_ALLOCATE 50 struct buffer * init_buffer() { struct buffer *b = MALLOC(1, struct buffer); b->b = MALLOC(MIN_ALLOCATE, char); b->allocated = MIN_ALLOCATE; b->length = 0; return b; } char * get_buffer(b) struct buffer *b; { return b->b; } size_t size_buffer(b) struct buffer *b; { return b->length; } static void resize_buffer P_((struct buffer *b, size_t newlen)); static void resize_buffer(b, newlen) struct buffer *b; size_t newlen; { char *try = NULL; size_t alen = b->allocated; if (newlen <= alen) return; alen *= 2; if (newlen < alen) try = realloc(b->b, alen); /* Note: *not* the REALLOC() macro! */ if (!try) { alen = newlen; try = REALLOC(b->b, alen, char); } b->allocated = alen; b->b = try; } char * add_buffer(b, p, n) struct buffer *b; const char *p; size_t n; { char *result; if (b->allocated - b->length < n) resize_buffer(b, b->length+n); result = memcpy(b->b + b->length, p, n); b->length += n; return result; } char * add1_buffer(b, c) struct buffer *b; int c; { /* This special case should be kept cheap; * don't make it just a mere convenience * wrapper for add_buffer() -- even "builtin" * versions of memcpy(a, b, 1) can become * expensive when called too often. */ if (c != EOF) { char *result; if (b->allocated - b->length < 1) resize_buffer(b, b->length+1); result = b->b + b->length++; *result = c; return result; } return NULL; } void free_buffer(b) struct buffer *b; { if (b) FREE(b->b); FREE(b); } sed-3.62/lib/utils.h0000644000076600007660000000366510143133571011243 00000000000000/* Functions from hack's utils library. Copyright (C) 1989, 1990, 1991, 1998, 1999, 2003 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include "basicdefs.h" void panic P_((const char *str, ...)); FILE *ck_fopen P_((const char *name, const char *mode, bool fail)); void ck_fwrite P_((const VOID *ptr, size_t size, size_t nmemb, FILE *stream)); size_t ck_fread P_((VOID *ptr, size_t size, size_t nmemb, FILE *stream)); void ck_fflush P_((FILE *stream)); void ck_fclose P_((FILE *stream)); size_t ck_getline P_((char **text, size_t *buflen, FILE *stream)); FILE * ck_mkstemp P_((char **p_filename, char *tmpdir, char *base)); void ck_rename P_((const char *from, const char *to, const char *unlink_if_fail)); VOID *ck_malloc P_((size_t size)); VOID *xmalloc P_((size_t size)); VOID *ck_realloc P_((VOID *ptr, size_t size)); char *ck_strdup P_((const char *str)); VOID *ck_memdup P_((const VOID *buf, size_t len)); void ck_free P_((VOID *ptr)); struct buffer *init_buffer P_((void)); char *get_buffer P_((struct buffer *b)); size_t size_buffer P_((struct buffer *b)); char *add_buffer P_((struct buffer *b, const char *p, size_t n)); char *add1_buffer P_((struct buffer *b, int ch)); void free_buffer P_((struct buffer *b)); extern const char *myname; sed-3.62/pcre/0000777000076600007660000000000010202633240010161 500000000000000sed-3.62/pcre/AUTHORS0000644000076600007660000000036210143133571011154 00000000000000Paolo Bonzini Based on PCRE-3.4, which was written by: Philip Hazel University of Cambridge Computing Service, Cambridge, England. Phone: +44 1223 334714. Copyright (c) 1997-2000 University of Cambridge sed-3.62/pcre/ChangeLog0000644000076600007660000002277310202631352011664 000000000000002005-02-10 Paolo Bonzini * regposix.c (compile_branch_posix): Support [[.a.]] and [[=a=]] in a crippled way. 2004-10-30 Paolo Bonzini * regstudy.c (prune_bracket): More improvements. Remove "prevptr" parameter. (pruned): Store zero for opcodes that do not have alternative non-backtracking opcodes. 2004-10-29 Paolo Bonzini * regstudy.c (set_start_bits, set_boyer_moore): Do several cleanups, including removing unused variables/labels, and turning while loops to do/whiles if it can be done safely. * regcomp.c: Do not use register. * regperl.c: Do not use register. * regposix.c: Do not use register. Simplify code to not test for unused opcodes (OP_COND, OP_ASSERT, etc.). 2004-10-29 Paolo Bonzini * regstudy.c (prune_bracket): Distinguish correctly the character class at the beginning vs. at the ending of a subexpression. Be more precise in the presence of alternatives and optional subexpressions. 2004-10-29 Paolo Bonzini * internal.h: fix formatting. 2004-03-04 Paolo Bonzini * regcomp.c: fix bugs in is_endline. 2004-02-29 Paolo Bonzini * regperl.c, regposix.c: move common functions... * regcomp.c: ... here. 2004-02-29 Paolo Bonzini * internal.h: add OP_ANCHOR_MATCH, ESC_G. * regdebug.c: Likewise. * regexec.c: Likewise. * regperl.c: Likewise. * regposix.c: Likewise. * regstudy.c: Likewise. 2004-01-15 Paolo Bonzini * regexp.c: drop regexec2, replace with REG_STARTEND found in NetBSD regexp. * regexp.h: likewise. 2003-09-19 Paolo Bonzini * regposix.c: recognize \s and \S. * regposix.c: compile (a){0,2} to (a)?(a)? instead of ((a)?(a))? so that it is possible to... * regexec.c: not assign offsets to optional brackets which match nothing, e.g. when matching (b?){1,2} to `b'. Actually, we do assign offsets the first time; this does not hamper the POSIXicity of ssed because anyway we don't get the wrong substitution for the backreference on the RHS: e.g. if you have s/(b?)?/<\1>/ with an empty pattern space, you'll get <> in the pattern space no matter if \1 did not match or if it matched the empty string at offsets [0,0). 2003-01-03 Paolo Bonzini * regtables.c (pcre_maketables): add [:blank:] * internal.h (cbit_blank): new * regperl.c: add [:blank:] * regposix.c: add [:blank:] 2002-09-18 Paolo Bonzini * regposix.c (pcre_posix_compile_nuls): fix error in determining length of .{1,64} * regperl.c (pcre_perl_compile_nuls): likewise 2002-01-06 Paolo Bonzini * regdebug.c: add _ONCE repetitions * regexec.c: likewise * regstudy.c: likewise * internal.h: likewise 2001-12-31 Paolo Bonzini ** Version 3.55 released * regposix.c (check_escape): inside a character class, parse unknown escapes (like \" or \p) as two separate characters. Signaled by John Fremlin. 2001-12-27 Paolo Bonzini ** Version 3.54 released 2001-12-19 Paolo Bonzini ** Version 3.53 released * regstudy.c (set_boyer_moore, set_start_bits): use new OP_TYPE and OP_TYPENOT* opcodes instead of OP_DIGIT & co. * regdebug.c (pcre_debug): likewise (print them) * regperl.c (compile_branch): likewise (compile them) * regposix.c (compile_branch): likewise (compile them) * internal.h: likewise (define them); refine meaning of bits in ctype table to allow for simpler OP_TYPE* code * regtables.c (pcre_maketables): set newline table. 2001-12-17 Paolo Bonzini * regstudy.c (set_bmtable, set_boyer_moore): implemented Boyer-Moore algorithm for first character search * regexec.c (pcre_exec): use the Boyer-Moore data 2001-12-14 Paolo Bonzini * internal.h (pcre_extra): encapsulate start_bits in a union, define PCRE_STUDY_BM * regexec.c (pcre_match): access the `data' union in pcre_extra * reginfo.c (pcre_info): likewise * regstudy.c (pcre_study): likewise 2001-12-13 Paolo Bonzini *** Version 3.52 released. 2001-12-12 Paolo Bonzini * internal.h: add max_match_size to pcre and compile_data * regexec.c (pcre_match): use re->max_match_size information * regexec.c (pcre_match) [DEBUG]: debug first character optimization * regposix.c (compile_branch, pcre_posix_compile_nuls): optimize regexps like xxxxxx$ where xxxxxx cannot match more than a certain number of characters. * regposix.c (is_endline): new function. 2001-10-15 Paolo Bonzini *** Version 3.51 released. 2001-10-13 Paolo Bonzini * regposix.c(pcre_posix_compile_nuls, basic_to_extended_regexp): fix code overflow bug when a [*+?] is treated as a literal character. This is actually not mandated by POSIX, which specifies "undefined behavior", but an internal error is not what I had in mind... 2001-09-25 Paolo Bonzini *** Version 3.50 released. 2001-06-05 Paolo Bonzini *** Version 3.49 released * regposix.c(check_escape, pcre_posix_compile_nuls): in POSIX regular expressions, inside classes, unrecognized escapes must make the backslash and the following character *really* independent; regexps like [/\] were previously broken. 2001-03-22 Paolo Bonzini *** Version 3.48 released 2001-03-02 Paolo Bonzini *** Version 3.47 released 2001-02-21 Paolo Bonzini *** Version 3.46 released 2001-02-09 Paolo Bonzini * regposix.c(compile_branch, read_repeat_counts): support GNU regex's behavior of compiling a{1,2}{2,3} like a{2,6} (multiplying the minimum and maximum counts) * regposix.c(basic_to_extended_regexp): compile * as a literal asterisk if at the start of a branch 2001-01-04 Paolo Bonzini * regexp.c(regncomp): pass REG_EXTENDED to the compilation functions (becomes PCRE_EXTENDED) 2001-01-03 Paolo Bonzini * regposix.c(check_escape): don't support things like [A\W]: it now means the same as [AW]. However, [\n\r] still means a CR or LF (that is, escapes that are character classes match a literal character, but escapes that match non-printable characters match the character). * regposix.c(compile_branch): simplified to account for the change above. 2000-12-21 Paolo Bonzini * pcre.h [BOOTSTRAP]: include malloc.h * regexp.c: modified POSIX error messages to resemble PCRE error messages whenever possible. * regposix.c(compile_branch): raise an error if unmatched braces are found. 2000-12-11 Paolo Bonzini * regposix.c: implement \o and \d like in GNU sed 3.02.80; removed \0. 2000-12-10 Paolo Bonzini * regposix.c(pcre_posix_compile_nuls): internationalized. * regperl.c(pcre_compile_nuls): internationalized. * pcregrep.c: internationalized. * internal.h: add standard NLS crap. * pcre.h: defined PCRE_ENGLISH_ERRORS * regexp.c: use PCRE_ENGLISH_ERRORS 2000-12-08 Paolo Bonzini * regexp.c(regerror): modified a bit to ease i18n. * regposix.c: converted the behavior of \ to POSIX (e.g. \11 is not the eleventh backref and \321 is not an octal sequence). 2000-12-07 Paolo Bonzini * regdebug.c: added \< and \> to the opcode names table 2000-11-21 Paolo Bonzini * regperl.c: handle regexps with embedded NULs * regposix.c: ditto * pcre.h: use prototypes * internal.h: ditto * regexp.h: ditto * regexp.h: declared regexec2, regncomp * regexp.c: defined regexec2, regncomp 2000-11-16 Paolo Bonzini * regposix.c: handle ^ and $ as literals if they're not the first or the last character, respectively. * regexp.c(regexec): handle correctly pmatch == NULL * regexec.c(pcre_exec): handle correctly pmatch == NULL 2000-11-15 Paolo Bonzini * regposix.c: removed [:^alnum:] and the like; added \` and \'; added basic regular expressions. * regexp.c(regnexec): new function 2000-11-14 Paolo Bonzini * internal.h: declared ESC_LESS and ESC_GREATER, ESC_FIRST_CONSUME and ESC_LAST_CONSUME, OP_BEG_WORD and OP_END_WORD * regexec.c(match): added OP_BEG_WORD and OP_END_WORD * regposix.c: created from regperl.c * regperl.c(compile_branch): use ESC_FIRST_CONSUME and ESC_LAST_CONSUME * regexp.c(regcomp): handle PCRE_DOTALL differently for Perl and POSIX regular expressions. 2000-11-13 Paolo Bonzini Started work to merge with sed. * AUTHORS: inserted myself... * COPYING: replaced with GNU GPL. Original terms stay in the LICENCE file. * Makefile.in: remove libtool usage, not good for a bootstrapping tool such as sed. * configure.in: likewise; also changed AC_CHECK_FUNCS to AC_REPLACE_FUNCS for memmove. * regdebug.c: new file, created from part of pcre.c. * regexec.c: new file, created from part of pcre.c. Removed UTF-8. * reginfo.c: new file, created from part of pcre.c. * internal.h: don't do strange things with memmove declarations. * regperl.c: new file, created from part of pcre.c. * pcre.c: split into many sources, removed. * regexp.c(regcomp, regexec): new name of pcreposix.c; use pcre_study * regexp.h: new name of pcreposix.h; added re_study member 2000-11-13 Paolo Bonzini * pcre.c(pcre_compile): Removed support for UTF-8. The default tables are generated at run-time rather than at compile-time to support cross compiling. sed-3.62/pcre/ChangeLog.pre-sed0000644000076600007660000006034610143133571013224 00000000000000ChangeLog for PCRE ------------------ Version 3.4 22-Aug-00 --------------------- 1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *. 2. Diagnose condition (?(0) as an error instead of crashing on matching. Version 3.3 01-Aug-00 --------------------- 1. If an octal character was given, but the value was greater than \377, it was not getting masked to the least significant bits, as documented. This could lead to crashes in some systems. 2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats the hyphen as a literal. PCRE used to give an error; it now behaves like Perl. 3. Added the functions pcre_free_substring() and pcre_free_substring_list(). These just pass their arguments on to (pcre_free)(), but they are provided because some uses of PCRE bind it to non-C systems that can call its functions, but cannot call free() or pcre_free() directly. 4. Add "make test" as a synonym for "make check". Corrected some comments in the Makefile. 5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the Makefile. 6. Changed the name of pgrep to pcregrep, because Solaris has introduced a command called pgrep for grepping around the active processes. 7. Added the beginnings of support for UTF-8 character strings. 8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and RANLIB to ./ltconfig so that they are used by libtool. I think these are all the relevant ones. (AR is not passed because ./ltconfig does its own figuring out for the ar command.) Version 3.2 12-May-00 --------------------- This is purely a bug fixing release. 1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead of ZA. This was just one example of several cases that could provoke this bug, which was introduced by change 9 of version 2.00. The code for breaking infinite loops after an iteration that matches an empty string was't working correctly. 2. The pcretest program was not imitating Perl correctly for the pattern /a*/g when matched against abbab (for example). After matching an empty string, it wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this caused it to match further down the string than it should. 3. The code contained an inclusion of sys/types.h. It isn't clear why this was there because it doesn't seem to be needed, and it causes trouble on some systems, as it is not a Standard C header. It has been removed. 4. Made 4 silly changes to the source to avoid stupid compiler warnings that were reported on the Macintosh. The changes were from while ((c = *(++ptr)) != 0 && c != '\n'); to while ((c = *(++ptr)) != 0 && c != '\n') ; Totally extraordinary, but if that's what it takes... 5. PCRE is being used in one environment where neither memmove() nor bcopy() is available. Added HAVE_BCOPY and an autoconf test for it; if neither HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which assumes the way PCRE uses memmove() (always moving upwards). 6. PCRE is being used in one environment where strchr() is not available. There was only one use in pcre.c, and writing it out to avoid strchr() probably gives faster code anyway. Version 3.1 09-Feb-00 --------------------- The only change in this release is the fixing of some bugs in Makefile.in for the "install" target: (1) It was failing to install pcreposix.h. (2) It was overwriting the pcre.3 man page with the pcreposix.3 man page. Version 3.0 01-Feb-00 --------------------- 1. Add support for the /+ modifier to perltest (to output $` like it does in pcretest). 2. Add support for the /g modifier to perltest. 3. Fix pcretest so that it behaves even more like Perl for /g when the pattern matches null strings. 4. Fix perltest so that it doesn't do unwanted things when fed an empty pattern. Perl treats empty patterns specially - it reuses the most recent pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this effect. 5. The POSIX interface was broken in that it was just handing over the POSIX captured string vector to pcre_exec(), but (since release 2.00) PCRE has required a bigger vector, with some working space on the end. This means that the POSIX wrapper now has to get and free some memory, and copy the results. 6. Added some simple autoconf support, placing the test data and the documentation in separate directories, re-organizing some of the information files, and making it build pcre-config (a GNU standard). Also added libtool support for building PCRE as a shared library, which is now the default. 7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and 09 are not valid octal constants. Single digits will be used for minor values less than 10. 8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that existing programs that set these in the POSIX interface can use PCRE without modification. 9. Added a new function, pcre_fullinfo() with an extensible interface. It can return all that pcre_info() returns, plus additional data. The pcre_info() function is retained for compatibility, but is considered to be obsolete. 10. Added experimental recursion feature (?R) to handle one common case that Perl 5.6 will be able to do with (?p{...}). 11. Added support for POSIX character classes like [:alpha:], which Perl is adopting. Version 2.08 31-Aug-99 ---------------------- 1. When startoffset was not zero and the pattern began with ".*", PCRE was not trying to match at the startoffset position, but instead was moving forward to the next newline as if a previous match had failed. 2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G, and could get into a loop if a null string was matched other than at the start of the subject. 3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can be distinguished at compile time, and for completeness also added PCRE_DATE. 5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL in GnuWin32 environments. Version 2.07 29-Jul-99 ---------------------- 1. The documentation is now supplied in plain text form and HTML as well as in the form of man page sources. 2. C++ compilers don't like assigning (void *) values to other pointer types. In particular this affects malloc(). Although there is no problem in Standard C, I've put in casts to keep C++ compilers happy. 3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call should be (const char *). 4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may be useful for non-Unix systems who don't want to bother with the POSIX stuff. However, I haven't made this a standard facility. The documentation doesn't mention it, and the Makefile doesn't support it. 5. The Makefile now contains an "install" target, with editable destinations at the top of the file. The pcretest program is not installed. 6. pgrep -V now gives the PCRE version number and date. 7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was causing the entire string to be ignored, instead of just the last character. 8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a non-matching string, it can take a very, very long time, even for strings of quite modest length, because of the nested recursion. PCRE now does better in some of these cases. It does this by remembering the last required literal character in the pattern, and pre-searching the subject to ensure it is present before running the real match. In other words, it applies a heuristic to detect some types of certain failure quickly, and in the above example, if presented with a string that has no trailing " it gives "no match" very quickly. 9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored; other alternatives are tried instead. Version 2.06 09-Jun-99 ---------------------- 1. Change pcretest's output for amount of store used to show just the code space, because the remainder (the data block) varies in size between 32-bit and 64-bit systems. 2. Added an extra argument to pcre_exec() to supply an offset in the subject to start matching at. This allows lookbehinds to work when searching for multiple occurrences in a string. 3. Added additional options to pcretest for testing multiple occurrences: /+ outputs the rest of the string that follows a match /g loops for multiple occurrences, using the new startoffset argument /G loops for multiple occurrences by passing an incremented pointer 4. PCRE wasn't doing the "first character" optimization for patterns starting with \b or \B, though it was doing it for other lookbehind assertions. That is, it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with the letter 'x'. On long subject strings, this gives a significant speed-up. Version 2.05 21-Apr-99 ---------------------- 1. Changed the type of magic_number from int to long int so that it works properly on 16-bit systems. 2. Fixed a bug which caused patterns starting with .* not to work correctly when the subject string contained newline characters. PCRE was assuming anchoring for such patterns in all cases, which is not correct because .* will not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if DOTALL is set at top level; otherwise it knows that patterns starting with .* must be retried after every newline in the subject. Version 2.04 18-Feb-99 ---------------------- 1. For parenthesized subpatterns with repeats whose minimum was zero, the computation of the store needed to hold the pattern was incorrect (too large). If such patterns were nested a few deep, this could multiply and become a real problem. 2. Added /M option to pcretest to show the memory requirement of a specific pattern. Made -m a synonym of -s (which does this globally) for compatibility. 3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being compiled in such a way that the backtracking after subsequent failure was pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of ((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size. Version 2.03 02-Feb-99 ---------------------- 1. Fixed typo and small mistake in man page. 2. Added 4th condition (GPL supersedes if conflict) and created separate LICENCE file containing the conditions. 3. Updated pcretest so that patterns such as /abc\/def/ work like they do in Perl, that is the internal \ allows the delimiter to be included in the pattern. Locked out the use of \ as a delimiter. If \ immediately follows the final delimiter, add \ to the end of the pattern (to test the error). 4. Added the convenience functions for extracting substrings after a successful match. Updated pcretest to make it able to test these functions. Version 2.02 14-Jan-99 ---------------------- 1. Initialized the working variables associated with each extraction so that their saving and restoring doesn't refer to uninitialized store. 2. Put dummy code into study.c in order to trick the optimizer of the IBM C compiler for OS/2 into generating correct code. Apparently IBM isn't going to fix the problem. 3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution calls, and wasn't printing the correct value for compiling calls. Increased the default value of LOOPREPEAT, and the number of significant figures in the times. 4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT. 5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid a building problem on Windows NT with a FAT file system. Version 2.01 21-Oct-98 ---------------------- 1. Changed the API for pcre_compile() to allow for the provision of a pointer to character tables built by pcre_maketables() in the current locale. If NULL is passed, the default tables are used. Version 2.00 24-Sep-98 ---------------------- 1. Since the (?>) facility is in Perl 5.005, don't require PCRE_EXTRA to enable it any more. 2. Allow quantification of (?>) groups, and make it work correctly. 3. The first character computation wasn't working for (?>) groups. 4. Correct the implementation of \Z (it is permitted to match on the \n at the end of the subject) and add 5.005's \z, which really does match only at the very end of the subject. 5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater. 6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005 localized options. All options to pcre_study() were also removed. 7. Add other new features from 5.005: $(?<= positive lookbehind $(?a*))*/ (a PCRE_EXTRA facility). Version 1.00 18-Nov-97 ---------------------- 1. Added compile-time macros to support systems such as SunOS4 which don't have memmove() or strerror() but have other things that can be used instead. 2. Arranged that "make clean" removes the executables. Version 0.99 27-Oct-97 ---------------------- 1. Fixed bug in code for optimizing classes with only one character. It was initializing a 32-byte map regardless, which could cause it to run off the end of the memory it had got. 2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction. Version 0.98 22-Oct-97 ---------------------- 1. Fixed bug in code for handling temporary memory usage when there are more back references than supplied space in the ovector. This could cause segfaults. Version 0.97 21-Oct-97 ---------------------- 1. Added the \X "cut" facility, conditional on PCRE_EXTRA. 2. Optimized negated single characters not to use a bit map. 3. Brought error texts together as macro definitions; clarified some of them; fixed one that was wrong - it said "range out of order" when it meant "invalid escape sequence". 4. Changed some char * arguments to const char *. 5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX). 6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in pcretest. Version 0.96 16-Oct-97 ---------------------- 1. Added a simple "pgrep" utility to the distribution. 2. Fixed an incompatibility with Perl: "{" is now treated as a normal character unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}" where "ddd" means "one or more decimal digits". 3. Fixed serious bug. If a pattern had a back reference, but the call to pcre_exec() didn't supply a large enough ovector to record the related identifying subpattern, the match always failed. PCRE now remembers the number of the largest back reference, and gets some temporary memory in which to save the offsets during matching if necessary, in order to ensure that backreferences always work. 4. Increased the compatibility with Perl in a number of ways: (a) . no longer matches \n by default; an option PCRE_DOTALL is provided to request this handling. The option can be set at compile or exec time. (b) $ matches before a terminating newline by default; an option PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline mode). The option can be set at compile or exec time. (c) The handling of \ followed by a digit other than 0 is now supposed to be the same as Perl's. If the decimal number it represents is less than 10 or there aren't that many previous left capturing parentheses, an octal escape is read. Inside a character class, it's always an octal escape, even if it is a single digit. (d) An escaped but undefined alphabetic character is taken as a literal, unless PCRE_EXTRA is set. Currently this just reserves the remaining escapes. (e) {0} is now permitted. (The previous item is removed from the compiled pattern). 5. Changed all the names of code files so that the basic parts are no longer than 10 characters, and abolished the teeny "globals.c" file. 6. Changed the handling of character classes; they are now done with a 32-byte bit map always. 7. Added the -d and /D options to pcretest to make it possible to look at the internals of compilation without having to recompile pcre. Version 0.95 23-Sep-97 ---------------------- 1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or \x20 at the start of a run of normal characters. These were being treated as real characters, instead of the source characters being re-checked. Version 0.94 18-Sep-97 ---------------------- 1. The functions are now thread-safe, with the caveat that the global variables containing pointers to malloc() and free() or alternative functions are the same for all threads. 2. Get pcre_study() to generate a bitmap of initial characters for non- anchored patterns when this is possible, and use it if passed to pcre_exec(). Version 0.93 15-Sep-97 ---------------------- 1. /(b)|(:+)/ was computing an incorrect first character. 2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(), but not actually doing anything yet. 3. Treat "-" characters in classes that cannot be part of ranges as literals, as Perl does (e.g. [-az] or [az-]). 4. Set the anchored flag if a branch starts with .* or .*? because that tests all possible positions. 5. Split up into different modules to avoid including unneeded functions in a compiled binary. However, compile and exec are still in one module. The "study" function is split off. 6. The character tables are now in a separate module whose source is generated by an auxiliary program - but can then be edited by hand if required. There are now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or toupper() in the code. 7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and make them global. Abolish the function for setting them, as the caller can now set them directly. Version 0.92 11-Sep-97 ---------------------- 1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character (e.g. /a{1,3}/) was broken (I mis-optimized it). 2. Caseless matching was not working in character classes if the characters in the pattern were in upper case. 3. Make ranges like [W-c] work in the same way as Perl for caseless matching. 4. Make PCRE_ANCHORED public and accept as a compile option. 5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to pass them. 6. Give an error if bad option bits passed at compile or run time. 7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to pcretest to cause it to pass that flag. 8. Add pcre_info(), to get the number of identifying subpatterns, the stored options, and the first character, if set. 9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character. Version 0.91 10-Sep-97 ---------------------- 1. PCRE was failing to diagnose unlimited repeats of subpatterns that could match the empty string as in /(a*)*/. It was looping and ultimately crashing. 2. PCRE was looping on encountering an indefinitely repeated back reference to a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what Perl does - treats the match as successful. **** sed-3.62/pcre/LICENCE0000644000076600007660000000363010143133571011072 00000000000000PCRE LICENCE ------------ PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by: Philip Hazel University of Cambridge Computing Service, Cambridge, England. Phone: +44 1223 334714. Copyright (c) 1997-2000 University of Cambridge Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. In practice, this means that if you use PCRE in software which you distribute to others, commercially or otherwise, you must put a sentence like this Regular expression support is provided by the PCRE library package, which is open source software, written by Philip Hazel, and copyright by the University of Cambridge, England. somewhere reasonably visible in your documentation and in any relevant files or online help data or similar. A reference to the ftp site for the source, that is, to ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ should also be given in the documentation. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), or Lesser General Purpose Licence (LGPL), then the terms of that licence shall supersede any condition above with which it is incompatible. The documentation for PCRE, supplied in the "doc" directory, is distributed under the same terms as the software itself. End sed-3.62/pcre/Makefile.am0000644000076600007660000000105410144674647012156 00000000000000## Process this file with automake to produce Makefile.in noinst_LIBRARIES = libpcre.a noinst_HEADERS = internal.h pcre.h regexp.h noinst_PROGRAMS = @PCREGREP@ EXTRA_PROGRAMS = pcregrep EXTRA_DIST = AUTHORS ChangeLog ChangeLog.pre-sed LICENCE README regcomp.c libpcre_a_SOURCES = regtables.c regsub.c regstudy.c regposix.c regperl.c \ reginfo.c regexec.c regexp.c regdebug.c AM_CPPFLAGS = -I$(top_srcdir)/lib -I$(top_srcdir)/intl -I$(top_srcdir)/pcre \ -I$(top_srcdir) -I$(top_builddir)/intl pcregrep_SOURCES = pcregrep.c pcregrep_LDADD = libpcre.a sed-3.62/pcre/Makefile.in0000644000076600007660000003473110202173547012163 00000000000000# Makefile.in generated by automake 1.9.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(libpcre_a_SOURCES) $(pcregrep_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = @PCREGREP@ EXTRA_PROGRAMS = pcregrep$(EXEEXT) subdir = pcre DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in AUTHORS ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/codeset.m4 \ $(top_srcdir)/config/getline.m4 \ $(top_srcdir)/config/gettext-ver.m4 \ $(top_srcdir)/config/gettext.m4 \ $(top_srcdir)/config/glibc21.m4 $(top_srcdir)/config/iconv.m4 \ $(top_srcdir)/config/lcmessage.m4 \ $(top_srcdir)/config/lib-ld.m4 \ $(top_srcdir)/config/lib-link.m4 \ $(top_srcdir)/config/lib-prefix.m4 \ $(top_srcdir)/config/progtest.m4 \ $(top_srcdir)/config/stdbool.m4 \ $(top_srcdir)/config/strverscmp.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libpcre_a_AR = $(AR) $(ARFLAGS) libpcre_a_LIBADD = am_libpcre_a_OBJECTS = regtables.$(OBJEXT) regsub.$(OBJEXT) \ regstudy.$(OBJEXT) regposix.$(OBJEXT) regperl.$(OBJEXT) \ reginfo.$(OBJEXT) regexec.$(OBJEXT) regexp.$(OBJEXT) \ regdebug.$(OBJEXT) libpcre_a_OBJECTS = $(am_libpcre_a_OBJECTS) PROGRAMS = $(noinst_PROGRAMS) am_pcregrep_OBJECTS = pcregrep.$(OBJEXT) pcregrep_OBJECTS = $(am_pcregrep_OBJECTS) pcregrep_DEPENDENCIES = libpcre.a DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libpcre_a_SOURCES) $(pcregrep_SOURCES) DIST_SOURCES = $(libpcre_a_SOURCES) $(pcregrep_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HTML_FALSE = @BUILD_HTML_FALSE@ BUILD_HTML_TRUE = @BUILD_HTML_TRUE@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ HAVE__BOOL = @HAVE__BOOL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKEINFO_HTML_FALSE = @MAKEINFO_HTML_FALSE@ MAKEINFO_HTML_TRUE = @MAKEINFO_HTML_TRUE@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCREGREP = @PCREGREP@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED_FEATURE_VERSION = @SED_FEATURE_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TEXI2HTML = @TEXI2HTML@ TEXI2HTML_HTML_FALSE = @TEXI2HTML_HTML_FALSE@ TEXI2HTML_HTML_TRUE = @TEXI2HTML_HTML_TRUE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ noinst_LIBRARIES = libpcre.a noinst_HEADERS = internal.h pcre.h regexp.h EXTRA_DIST = AUTHORS ChangeLog ChangeLog.pre-sed LICENCE README regcomp.c libpcre_a_SOURCES = regtables.c regsub.c regstudy.c regposix.c regperl.c \ reginfo.c regexec.c regexp.c regdebug.c AM_CPPFLAGS = -I$(top_srcdir)/lib -I$(top_srcdir)/intl -I$(top_srcdir)/pcre \ -I$(top_srcdir) -I$(top_builddir)/intl pcregrep_SOURCES = pcregrep.c pcregrep_LDADD = libpcre.a all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits pcre/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnits pcre/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libpcre.a: $(libpcre_a_OBJECTS) $(libpcre_a_DEPENDENCIES) -rm -f libpcre.a $(libpcre_a_AR) libpcre.a $(libpcre_a_OBJECTS) $(libpcre_a_LIBADD) $(RANLIB) libpcre.a clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) pcregrep$(EXEEXT): $(pcregrep_OBJECTS) $(pcregrep_DEPENDENCIES) @rm -f pcregrep$(EXEEXT) $(LINK) $(pcregrep_LDFLAGS) $(pcregrep_OBJECTS) $(pcregrep_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcregrep.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regdebug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regexec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regexp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reginfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regperl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regposix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regstudy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regsub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regtables.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: sed-3.62/pcre/README0000644000076600007660000003255610143133571010776 00000000000000README file for PCRE (Perl-compatible regular expression library) ----------------------------------------------------------------- The latest release of PCRE is always available from ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz Note that PCRE as included in super-sed is quite different from the original. The implementation has been split into more files, and internationalized; a POSIX regular expression parser was added (which in turn meant adding a few opcodes to the matcher), UTF-8 support was removed, and patterns with embedded nuls were supported. This is what will make a version lifted from the site and merged tout-court fail with 100% probability. In addition, the POSIX expression parser has a special optimization that is turned on by expressions like "\n$" (in general, expression with a definite maximum length and anchored to the end of the pattern), which makes the matcher skip non-relevant parts of the subject and leap to its end. PCRE has its own native API, but a set of "wrapper" functions that are based on the POSIX API are also supplied in the library. Note that this still provides the ability to use Perl semantics for regular expressions through a non-POSIX option flag, REG_PERL. The definition of REG_PERL is a good way to check if the POSIX API for regular expression is actually PCRE's implementation. The header file for the POSIX-style functions is called regexp.h. The official POSIX name is regex.h, but I didn't want to risk possible problems with existing files of that name by distributing it that way. To use it with an existing program that uses the POSIX API, it will have to be renamed or pointed at by a link. You will obtain PCRE's behavior and speed, but not Perl semantics unless you modify the program to use REG_PERL. Technical Notes about PCRE -------------------------- Many years ago I implemented some regular expression functions to an algorithm suggested by Martin Richards. These were not Unix-like in form, and were quite restricted in what they could do by comparison with Perl. The interesting part about the algorithm was that the amount of space required to hold the compiled form of an expression was known in advance. The code to apply an expression did not operate by backtracking, as the Henry Spencer and Perl code does, but instead checked all possibilities simultaneously by keeping a list of current states and checking all of them as it advanced through the subject string. (In the terminology of Jeffrey Friedl's book, it was a "DFA algorithm".) When the pattern was all used up, all remaining states were possible matches, and the one matching the longest subset of the subject string was chosen. This did not necessarily maximize the individual wild portions of the pattern, as is expected in Unix and Perl-style regular expressions. By contrast, the code originally written by Henry Spencer and subsequently heavily modified for Perl actually compiles the expression twice: once in a dummy mode in order to find out how much store will be needed, and then for real. The execution function operates by backtracking and maximizing (or, optionally, minimizing in Perl) the amount of the subject that matches individual wild portions of the pattern. This is an "NFA algorithm" in Friedl's terminology. For the set of functions that forms PCRE (which are unrelated to those mentioned above), I tried at first to invent an algorithm that used an amount of store bounded by a multiple of the number of characters in the pattern, to save on compiling time. However, because of the greater complexity in Perl regular expressions, I couldn't do this. In any case, a first pass through the pattern is needed, in order to find internal flag settings like (?i) at top level. So PCRE works by running a very degenerate first pass to calculate a maximum store size, and then a second pass to do the real compile - which may use a bit less than the predicted amount of store. The idea is that this is going to turn out faster because the first pass is degenerate and the second pass can just store stuff straight into the vector. It does make the compiling functions bigger, of course, but they have got quite big anyway to handle all the Perl stuff. The compiled form of a pattern is a vector of bytes, containing items of variable length. The first byte in an item is an opcode, and the length of the item is either implicit in the opcode or contained in the data bytes which follow it. A list of all the opcodes follows: Opcodes with no following data ------------------------------ These items are all just one byte long OP_END end of pattern OP_ANY match any character OP_SOD match start of data: \A OP_CIRC ^ (start of data, or after \n in multiline) OP_NOT_WORD_BOUNDARY \W OP_WORD_BOUNDARY \w OP_EODN match end of data or \n at end: \Z OP_EOD match end of data: \z OP_DOLL $ (end of data, or before \n in multiline) OP_RECURSE match the pattern recursively Repeating single characters --------------------------- The common repeats (*, +, ?) when applied to a single character appear as two-byte items using the following opcodes: OP_MAXSTAR OP_MINSTAR OP_ONCESTAR OP_MAXPLUS OP_MINPLUS OP_ONCEPLUS OP_MAXQUERY OP_MINQUERY OP_ONCEQUERY Those with "MIN" in their name are the minimizing versions; those with ONCE instead are maximizing but do not do backtracking. Each is followed by the character that is to be repeated. Other repeats make use of OP_MAXUPTO OP_MINUPTO OP_ONCEUPTO OP_EXACT which are followed by a two-byte count (most significant first) and the repeated character. OP_*UPTO matches from 0 to the given number. A repeat with a non-zero minimum and a fixed maximum is coded as an OP_EXACT followed by an OP_*UPTO. Character types --------------- Things like \d, both repeated and not, are done exactly like repeated characters, except that instead of a character, the opcode for the type is stored in the data byte: 0 matches no character (all characters when negated), 1 matches digits, 2 matches whitespace, 3 matches word characters. The opcodes are: OP_TYPE OP_TYPENOT OP_TYPE_MAXSTAR OP_TYPENOT_MAXSTAR OP_TYPE_MINSTAR OP_TYPENOT_MINSTAR OP_TYPE_ONCESTAR OP_TYPENOT_ONCESTAR OP_TYPE_MAXPLUS OP_TYPENOT_MAXPLUS OP_TYPE_MINPLUS OP_TYPENOT_MINPLUS OP_TYPE_ONCEPLUS OP_TYPENOT_ONCEPLUS OP_TYPE_MAXQUERY OP_TYPENOT_MAXQUERY OP_TYPE_MINQUERY OP_TYPENOT_MINQUERY OP_TYPE_ONCEQUERY OP_TYPENOT_ONCEQUERY OP_TYPE_MAXUPTO OP_TYPENOT_MAXUPTO OP_TYPE_MINUPTO OP_TYPENOT_MINUPTO OP_TYPE_ONCEUPTO OP_TYPENOT_ONCEUPTO OP_TYPE_EXACT OP_TYPENOT_EXACT The opcodes on the first line are the two that do not handle backtracking nor repeats. Matching a character string --------------------------- The OP_CHARS opcode is followed by a one-byte count and then that number of characters. If there are more than 255 characters in sequence, successive instances of OP_CHARS are used. Character classes ----------------- OP_CLASS is used for a character class, provided there are at least two characters in the class. If there is only one character, OP_CHARS is used for a positive class, and OP_NOT for a negative one (that is, for something like [^a]). Another set of repeating opcodes (OP_NOT_MAXSTAR etc.) are used for a repeated, negated, single-character class. The normal ones (OP_MAXSTAR etc.) are used for a repeated positive single-character class. OP_CLASS is followed by a 32-byte bit map containing a 1 bit for every character that is acceptable. The bits are counted from the least significant end of each byte. Back references --------------- OP_REF is followed by two bytes containing the reference number. Repeating character classes and back references ----------------------------------------------- This applies to OP_CLASS and OP_REF. For generic ranges (not + * ?) we use a single "RANGE" opcode instead of the UPTO+EXACT combination: these are OP_CL_MAXRANGE OP_CL_MINRANGE OP_CL_ONCERANGE OP_REF_MAXRANGE OP_REF_MINRANGE OP_REF_ONCERANGE and are followed by four bytes of data, comprising the minimum and maximum repeat counts. Single-character classes are handled specially (see above). Brackets and alternation ------------------------ A pair of non-capturing (round) brackets is wrapped round each expression at compile time, so alternation always happens in the context of brackets. Non-capturing brackets use the opcode OP_BRA, while capturing brackets use OP_BRA+1, OP_BRA+2, etc. [Note for North Americans: "bracket" to some English speakers, including myself, can be round, square, curly, or pointy. Hence this usage.] Originally PCRE was limited to 99 capturing brackets (so as not to use up all the opcodes). From release 3.5, there is no limit. What happens is that the first ones, up to EXTRACT_BASIC_MAX are handled with separate opcodes, as above. If there are more, the opcode is set to EXTRACT_BASIC_MAX+1, and the first operation in the bracket is OP_BRANUMBER, followed by a 2-byte bracket number. This opcode is ignored while matching, but is fished out when handling the bracket itself. (They could have all been done like this, but I was making minimal changes.) A bracket opcode is followed by two bytes which give the offset to the next alternative OP_ALT or, if there aren't any branches, to the matching KET opcode. Each OP_ALT is followed by two bytes giving the offset to the next one, or to the KET opcode. OP_KET is used for subpatterns that do not repeat indefinitely, while OP_KET_MINSTAR, OP_KET_MAXSTAR and OP_KET_ONCESTAR are used for indefinite repetitions, minimally or maximally respectively. All three are followed by two bytes giving (as a positive number) the offset back to the matching BRA opcode. If a subpattern is quantified such that it is permitted to match zero times, it is preceded by one of OP_BRAZERO or OP_BRAMINZERO. These are single-byte opcodes which tell the matcher that skipping this subpattern entirely is a valid branch. A subpattern with an indefinite maximum repetition is replicated in the compiled data its minimum number of times (or once with a BRAZERO if the minimum is zero), with the final copy terminating with a KETRMIN or KETRMAX as appropriate. A subpattern with a bounded maximum repetition is replicated in a nested fashion up to the maximum number of times, with BRAZERO or BRAMINZERO before each replication after the minimum, so that, for example, (abc){2,5} is compiled as (abc)(abc)((abc)((abc)(abc)?)?)?. The 99 and 200 bracket limits do not apply to these internally generated brackets. Assertions ---------- Forward assertions are just like other subpatterns, but starting with one of the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion is OP_REVERSE, followed by a two byte count of the number of characters to move back the pointer in the subject string. A separate count is present in each alternative of a lookbehind assertion, allowing them to have different fixed lengths. Once-only subpatterns --------------------- These are also just like other subpatterns, but they start with the opcode OP_ONCE. Conditional subpatterns ----------------------- These are like other subpatterns, but they start with the opcode OP_COND. If the condition is a back reference, this is stored at the start of the subpattern using the opcode OP_CREF followed by two bytes containing the reference number. Otherwise, a conditional subpattern will always start with one of the assertions. Changing options ---------------- If any of the /i, /m, or /s options are changed within a parenthesized group, an OP_OPT opcode is compiled, followed by one byte containing the new settings of these flags. If there are several alternatives in a group, there is an occurrence of OP_OPT at the start of all those following the first options change, to set appropriate options for the start of the alternative. Immediately after the end of the group there is another such item to reset the flags to their previous values. Other changes of flag within the pattern can be handled entirely at compile time, and so do not cause anything to be put into the compiled data. Character tables ---------------- PCRE uses four tables for manipulating and identifying characters. The final argument of the pcre_*compile*() functions is a pointer to a block of memory containing the concatenated tables. A call to pcre_maketables() can be used to generate a set of tables in the current locale. If the final argument for pcre_*_compile*() is passed as NULL, a set of default tables that is built into the binary is used. The first two 256-byte tables provide lower casing and case flipping functions, respectively. The next table consists of many 32-byte bit maps which identify digits, "word" characters, white space, and so on. These are used when building 32-byte bit maps that represent character classes. The final 256-byte table has bits indicating various character types, as follows: 1 newline 2 decimal digit 4 white space character 8 alphanumeric or '_' 16 letter 32 hexadecimal digit 128 regular expression metacharacter or binary zero You should not alter the set of characters that contain the 128 bit, as that will cause PCRE to malfunction. Philip Hazel October 2001 modified by Paolo Bonzini January 2002 sed-3.62/pcre/internal.h0000644000076600007660000003714710143133571012104 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ #ifndef PCRE_INTERNAL_H #define PCRE_INTERNAL_H /* This header contains definitions that are shared between the different modules, but which are not relevant to the outside. */ /* Get the definitions provided by running "configure" */ #include "config.h" /* #define DEBUG */ /* Standard C headers plus the external interface definition */ #include "basicdefs.h" #include #include #include #ifdef HAVE_STDDEF_H # include #endif #ifdef STDC_HEADERS # include #endif #ifdef HAVE_STRING_H # include #else # include #endif #ifdef HAVE_MEMORY_H # include #endif #ifndef HAVE_STRCHR # define strchr index # define strrchr rindex #endif #include "pcre.h" #ifdef HAVE_LIMITS_H #include #else #define INT_MAX ((1L<<30)-1+(1L<<30)) #define INT_MIN (-(1L<<30)-(1L<<30)) #endif #ifndef HAVE_MEMSET #define memset(s, better_be_zero, n) (better_be_zero ? abort() : bzero(s, n)) #endif /* In case there is no definition of offsetof() provided - though any proper Standard C system should have one. */ #ifndef offsetof #define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field)) #endif /* These are the public options that can change during matching. */ #define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL) /* Private options flags start at the most significant end of the four bytes, but skip the top bit so we can use ints for convenience without getting tangled with negative values. The public options defined in pcre.h start at the least significant end. Make sure they don't overlap, though now that we have expanded to four bytes there is plenty of space. */ #define PCRE_FIRSTSET 0x40000000 /* first_char is set */ #define PCRE_REQCHSET 0x20000000 /* req_char is set */ #define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */ #define PCRE_INGROUP 0x08000000 /* compiling inside a group */ #define PCRE_ICHANGED 0x04000000 /* i option changes within regex */ /* Options for the "extra" block produced by pcre_study(). */ #define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */ #define PCRE_STUDY_BM 0x02 /* a Boyer-Moore map exists */ /* Masks for identifying the public options which are permitted at compile time, run time or study time, respectively. */ #define PUBLIC_OPTIONS \ (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY| \ PCRE_ENGLISH_ERRORS) #define PUBLIC_EXEC_OPTIONS \ (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY) #define PUBLIC_STUDY_OPTIONS \ (PCRE_STUDY_NO_PRUNE|PCRE_STUDY_NO_START) /* Magic number to provide a small check against being handed junk. */ #define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ /* Miscellaneous definitions */ typedef int BOOL; #define FALSE 0 #define TRUE 1 /* These are escaped items that aren't just an encoding of a particular data value such as \n. They must have non-zero values, as check_escape() returns their negation. Also, they must appear in the same order as in the opcode definitions below, up to ESC_z. The final one must be ESC_REF as subsequent values are used for \1, \2, \3, etc. */ enum { ESC_LESS = 1, ESC_GREATER, ESC_G, ESC_B, ESC_b, ESC_A, ESC_Z, ESC_z, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W, ESC_w, ESC_FIRST_CONSUME = ESC_D, ESC_LAST_CONSUME = ESC_w, ESC_REF, }; enum { KIND_MAX, KIND_MIN, KIND_ONCE }; /* Opcode table: OP_BRA must be last, as all values >= it are used for brackets that extract substrings. Starting from 1 (i.e. after OP_END), the values up to OP_EOD must correspond in order to the list of escapes immediately above. */ enum { OP_END, /* End of pattern */ /* Values corresponding to backslashed assertions */ OP_BEG_WORD, /* \< */ OP_END_WORD, /* \> */ OP_ANCHOR_MATCH, /* \G */ OP_NOT_WORD_BOUNDARY, /* \B */ OP_WORD_BOUNDARY, /* \b */ OP_SOD, /* Start of data: \A */ OP_EODN, /* End of data or \n at end of data: \Z. */ OP_EOD, /* End of data: \z */ OP_OPT, /* Set runtime options */ OP_CIRC, /* Start of line - varies with multiline switch */ OP_DOLL, /* End of line - varies with multiline switch */ OP_ANY, /* Match any character */ OP_CHARS, /* Match string of characters */ OP_MAXSTAR, /* The maximizing and minimizing versions of */ OP_MINSTAR, /* all these opcodes must come in triples, with */ OP_ONCESTAR, /* the minimizing one second and the */ OP_MAXPLUS, /* no-backtracking one third. */ OP_MINPLUS, /* This first set applies to single characters */ OP_ONCEPLUS, OP_MAXQUERY, OP_MINQUERY, OP_ONCEQUERY, OP_MAXUPTO, /* From 0 to n matches */ OP_MINUPTO, OP_ONCEUPTO, OP_EXACT, OP_NOT, /* Match anything but the following char */ OP_NOT_MAXSTAR, /* The maximizing and minimizing versions of */ OP_NOT_MINSTAR, /* all these opcodes must come in triples, with */ OP_NOT_ONCESTAR, /* the minimizing one second and the */ OP_NOT_MAXPLUS, /* no-backtracking one third. */ OP_NOT_MINPLUS, /* This set applies to "not" single characters */ OP_NOT_ONCEPLUS, OP_NOT_MAXQUERY, OP_NOT_MINQUERY, OP_NOT_ONCEQUERY, OP_NOT_MAXUPTO, /* From 0 to n matches */ OP_NOT_MINUPTO, OP_NOT_ONCEUPTO, OP_NOTEXACT, /* Exactly n matches */ OP_TYPE, OP_TYPE_MAXSTAR, /* The maximizing and minimizing versions of */ OP_TYPE_MINSTAR, /* all these opcodes must come in triples, with */ OP_TYPE_ONCESTAR, /* the minimizing one second and the */ OP_TYPE_MAXPLUS, /* no-backtracking one third. These codes must */ OP_TYPE_MINPLUS, /* be in exactly the same order as those above. */ OP_TYPE_ONCEPLUS, OP_TYPE_MAXQUERY, /* This set applies to character types such as \d */ OP_TYPE_MINQUERY, OP_TYPE_ONCEQUERY, OP_TYPE_MAXUPTO, /* From 0 to n matches */ OP_TYPE_MINUPTO, OP_TYPE_ONCEUPTO, OP_TYPEEXACT, /* Exactly n matches */ OP_TYPENOT, OP_TYPENOT_MAXSTAR, /* The maximizing and minimizing versions of */ OP_TYPENOT_MINSTAR, /* all these opcodes must come in triples, with */ OP_TYPENOT_ONCESTAR, /* the minimizing one second and the */ OP_TYPENOT_MAXPLUS, /* no-backtracking one third. These codes must */ OP_TYPENOT_MINPLUS, /* be in exactly the same order as those above. */ OP_TYPENOT_ONCEPLUS, OP_TYPENOT_MAXQUERY, /* This set applies to character types such as \D */ OP_TYPENOT_MINQUERY, OP_TYPENOT_ONCEQUERY, OP_TYPENOT_MAXUPTO, /* From 0 to n matches */ OP_TYPENOT_MINUPTO, OP_TYPENOT_ONCEUPTO, OP_TYPENOTEXACT, /* Exactly n matches */ OP_CLASS, /* Match a character class */ OP_CL_MAXSTAR, /* The maximizing and minimizing versions of */ OP_CL_MINSTAR, /* all these opcodes must come in pairs, with */ OP_CL_ONCESTAR, /* the minimizing one second and the */ OP_CL_MAXPLUS, /* no-backtracking one third. These codes must */ OP_CL_MINPLUS, /* be in exactly the same order as those above. */ OP_CL_ONCEPLUS, OP_CL_MAXQUERY, /* These are for character classes */ OP_CL_MINQUERY, OP_CL_ONCEQUERY, OP_CL_MAXRANGE, /* These are different to the three seta above. */ OP_CL_MINRANGE, OP_CL_ONCERANGE, OP_REF, /* Match a back reference */ OP_REF_MAXSTAR, /* The maximizing and minimizing versions of */ OP_REF_MINSTAR, /* all these opcodes must come in pairs, with */ OP_REF_ONCESTAR, /* the minimizing one second and the */ OP_REF_MAXPLUS, /* no-backtracking one third. These codes must */ OP_REF_MINPLUS, /* be in exactly the same order as those above. */ OP_REF_ONCEPLUS, OP_REF_MAXQUERY, /* These are for character classes */ OP_REF_MINQUERY, OP_REF_ONCEQUERY, OP_REF_MAXRANGE, /* These are different to the three seta above. */ OP_REF_MINRANGE, OP_REF_ONCERANGE, OP_RECURSE, /* Match this pattern recursively */ OP_ALT, /* Start of alternation */ OP_KET, /* End of group that doesn't have an unbounded repeat */ OP_KET_MAXSTAR, /* These three must remain together and in this */ OP_KET_MINSTAR, /* order. They are for groups the repeat for ever. */ OP_KET_ONCESTAR, /* The assertions must come before ONCE and COND */ OP_ASSERT, /* Positive lookahead */ OP_ASSERT_NOT, /* Negative lookahead */ OP_ASSERTBACK, /* Positive lookbehind */ OP_ASSERTBACK_NOT, /* Negative lookbehind */ OP_REVERSE, /* Move pointer back - used in lookbehind assertions */ /* ONCE and COND must come after the assertions, with ONCE first, as there's a test for >= ONCE for a subpattern that isn't an assertion. */ OP_ONCE, /* Once matched, don't back up into the subpattern */ OP_COND, /* Conditional group */ OP_CREF, /* Used to hold an extraction string number (cond ref) */ OP_BRAZERO, /* These two must remain together and in this */ OP_BRAMINZERO, /* order. */ OP_BRANUMBER, /* Used for extracting brackets whose number is greater than can fit into an opcode. */ OP_BRA /* This and greater values are used for brackets that extract substrings up to a basic limit. After that, use is made of OP_BRANUMBER. */ }; /* The highest extraction number. This is limited by the number of opcodes left after OP_BRA, i.e. 255 - OP_BRA. We actually set it somewhat lower to leave room for additional opcodes.. */ #define EXTRACT_BASIC_MAX 150 /* The texts of compile-time error messages are defined as macros here so that they can be accessed by the POSIX wrapper and converted into error codes. Yes, I could have used error codes in the first place, but didn't feel like changing just to accommodate the POSIX wrapper. */ /* All character handling must be done as unsigned characters. Otherwise there are problems with top-bit-set characters and functions such as isspace(). However, we leave the interface to the outside world as char *, because that should make things easier for callers. We define a short type for unsigned char to save lots of typing. I tried "uchar", but it causes problems on Digital Unix, where it is defined in sys/types, so use "uschar" instead. */ typedef unsigned char uschar; typedef uschar bitset[32]; /* The real format of the start of the pcre block; the actual code vector runs on as long as necessary after the end. */ struct pcre { unsigned long int magic_number; size_t size; ssize_t max_match_size; const unsigned char *tables; unsigned long int options; unsigned short int top_bracket; unsigned short int top_backref; uschar first_char; uschar req_char; uschar code[1]; }; /* The real format of the extra block returned by pcre_study(). */ struct pcre_extra { uschar options; union { bitset start_bits; uschar bmtable[257]; } data; }; /* Structure for passing "static" information around between the functions doing the compiling, so that they are thread-safe. */ typedef struct compile_data { const uschar *lcc; /* Points to lower casing table */ const uschar *fcc; /* Points to case-flipping table */ const uschar *cbits; /* Points to character type table */ const uschar *ctypes; /* Points to table of type maps */ const uschar *end; /* Points to last valid byte */ ssize_t max_match_size; } compile_data; /* Structure for passing "static" information around between the functions doing the matching, so that they are thread-safe. */ typedef struct match_data { int errorcode; /* As it says */ int *offset_vector; /* Offset vector */ int offset_end; /* One past the end */ int offset_max; /* The maximum usable for return data */ const uschar *lcc; /* Points to lower casing table */ const uschar *ctypes; /* Points to table of type maps */ BOOL offset_overflow; /* Set if too many extractions */ BOOL notbol; /* NOTBOL flag */ BOOL noteol; /* NOTEOL flag */ BOOL utf8; /* UTF8 flag */ BOOL endonly; /* Dollar not before final \n */ BOOL notempty; /* Empty string match not wanted */ const uschar *start_pattern; /* For use when recursing */ const uschar *start_subject; /* Start of the subject string */ const uschar *end_subject; /* End of the subject string */ const uschar *first_start; /* Part of subject considered by preg_exec */ const uschar *start_match; /* Start of this match attempt */ const uschar *end_match_ptr; /* Subject position at end match */ int end_offset_top; /* Highwater mark at end of match */ } match_data; /* Bit definitions for entries in the pcre_ctypes table. */ #define ctype_newline 0x01 #define ctype_digit 0x02 /* must follow the other in the escapes above */ #define ctype_space 0x04 #define ctype_word 0x08 /* alphameric or '_' */ #define ctype_letter 0x10 #define ctype_xdigit 0x20 #define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */ /* Offsets for the bitmap tables in pcre_cbits. Each table contains a set of bits for a class map. Some classes are built by combining these tables. */ #define cbit_xdigit 0 /* [:xdigit:] */ #define cbit_digit 32 /* [:digit:] */ #define cbit_space 64 /* [:space:] */ #define cbit_word 96 /* [:word:] */ #define cbit_upper 128 /* [:upper:] */ #define cbit_lower 160 /* [:lower:] */ #define cbit_graph 192 /* [:graph:] */ #define cbit_print 224 /* [:print:] */ #define cbit_punct 256 /* [:punct:] */ #define cbit_cntrl 288 /* [:cntrl:] */ #define cbit_blank 320 /* [:blank:] */ #define cbit_length 352 /* Length of the cbits table */ /* Offsets of the various tables from the base tables pointer, and total length. */ #define lcc_offset 0 #define fcc_offset 256 #define cbits_offset 512 #define ctypes_offset (cbits_offset + cbit_length) #define tables_length (ctypes_offset + 256) #ifdef __STDC__ #define __PCRE_PROTO(a) a #else #define __PCRE_PROTO(a) () #endif extern void pcre_debug __PCRE_PROTO ((pcre *)); extern const char *pcre_estrings[]; extern const char *pcre_OP_names[]; #endif sed-3.62/pcre/pcre.h0000644000076600007660000000666510143133571011222 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* Copyright (c) 1997-2000 University of Cambridge */ #ifndef _PCRE_H #define _PCRE_H /* Have to include stdlib.h in order to ensure that size_t is defined; it is needed here for malloc. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef STDC_HEADERS #include #endif #ifdef BOOTSTRAP #include #endif /* Allow for C++ users */ #ifdef __cplusplus extern "C" { #endif #ifdef __STDC__ #define __PCRE_PROTO(a) a #else #define __PCRE_PROTO(a) () #endif /* Options */ #define PCRE_CASELESS 0x0001 #define PCRE_MULTILINE 0x0002 #define PCRE_DOTALL 0x0004 #define PCRE_EXTENDED 0x0008 #define PCRE_ANCHORED 0x0010 #define PCRE_DOLLAR_ENDONLY 0x0020 #define PCRE_EXTRA 0x0040 #define PCRE_NOTBOL 0x0080 #define PCRE_NOTEOL 0x0100 #define PCRE_UNGREEDY 0x0200 #define PCRE_NOTEMPTY 0x0400 #define PCRE_ENGLISH_ERRORS 0x0800 #define PCRE_STUDY_NO_PRUNE 0x04 #define PCRE_STUDY_NO_START 0x08 /* Exec-time and get-time error codes */ #define PCRE_ERROR_NOMATCH (-1) #define PCRE_ERROR_NULL (-2) #define PCRE_ERROR_BADOPTION (-3) #define PCRE_ERROR_BADMAGIC (-4) #define PCRE_ERROR_UNKNOWN_NODE (-5) #define PCRE_ERROR_NOMEMORY (-6) #define PCRE_ERROR_NOSUBSTRING (-7) /* Request types for pcre_fullinfo() */ #define PCRE_INFO_OPTIONS 0 #define PCRE_INFO_SIZE 1 #define PCRE_INFO_CAPTURECOUNT 2 #define PCRE_INFO_BACKREFMAX 3 #define PCRE_INFO_FIRSTCHAR 4 #define PCRE_INFO_FIRSTTABLE 5 #define PCRE_INFO_LASTLITERAL 6 #define PCRE_INFO_BMTABLE 7 /* Types */ struct pcre; struct pcre_extra; typedef struct pcre pcre; typedef struct pcre_extra pcre_extra; /* Store get and free functions. These can be set to alternative malloc/free functions if required. */ extern void *(*pcre_malloc) (size_t); extern void (*pcre_free) (void *); /* Functions */ extern pcre *pcre_posix_compile __PCRE_PROTO ((const char *, int, const char **, int *, const unsigned char *)); extern pcre *pcre_compile __PCRE_PROTO ((const char *, int, const char **, int *, const unsigned char *)); extern pcre *pcre_posix_compile_nuls __PCRE_PROTO ((const char *, int, int, const char **, int *, const unsigned char *)); extern pcre *pcre_compile_nuls __PCRE_PROTO ((const char *, int, int, const char **, int *, const unsigned char *)); extern int pcre_copy_substring __PCRE_PROTO ((const char *, int *, int, int, char *, int)); extern int pcre_exec __PCRE_PROTO ((const pcre *, const pcre_extra *, const char *, int, int, int, int *, int)); extern void pcre_free_substring __PCRE_PROTO ((const char *)); extern void pcre_free_substring_list __PCRE_PROTO ((const char **)); extern int pcre_get_substring __PCRE_PROTO ((const char *, int *, int, int, const char **)); extern int pcre_get_substring_list __PCRE_PROTO ((const char *, int *, int, const char ***)); extern int pcre_info __PCRE_PROTO ((const pcre *, const pcre_extra *, int, void *)); extern const unsigned char *pcre_maketables __PCRE_PROTO ((void)); extern pcre_extra *pcre_study __PCRE_PROTO ((const pcre *, int, const char **)); #ifdef __cplusplus } /* extern "C" */ #endif #undef __PCRE_PROTO #endif sed-3.62/pcre/pcregrep.c0000644000076600007660000001301510143133571012056 00000000000000/************************************************* * pcregrep program * *************************************************/ /* This is a grep program that uses the PCRE regular expression library to do its pattern matching. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifdef STDC_HEADERS #include #include #endif #include #include "pcre.h" #ifdef HAVE_LOCALE_H #include #endif #ifdef ENABLE_NLS # include #else # define gettext(s) (s) #endif #define _(s) gettext(s) #define FALSE 0 #define TRUE 1 typedef int BOOL; /************************************************* * Global variables * *************************************************/ static pcre *pattern; static pcre_extra *hints; static BOOL count_only = FALSE; static BOOL filenames_only = FALSE; static BOOL invert = FALSE; static BOOL number = FALSE; static BOOL silent = FALSE; static BOOL whole_lines = FALSE; /************************************************* * Grep an individual file * *************************************************/ static int pcregrep (in, name) FILE *in; char *name; { int rc = 1; int linenumber = 0; int count = 0; int offsets[99]; char buffer[BUFSIZ]; while (fgets (buffer, sizeof (buffer), in) != NULL) { BOOL match; int length = (int) strlen (buffer); if (length > 0 && buffer[length - 1] == '\n') buffer[--length] = 0; linenumber++; match = pcre_exec (pattern, hints, buffer, length, 0, 0, offsets, 99) >= 0; if (match && whole_lines && offsets[1] != length) match = FALSE; if (match != invert) { if (count_only) count++; else if (filenames_only) { printf("%s\n", (name == NULL) ? "" : name); return 0; } else if (silent) return 0; else { if (name != NULL) printf("%s:", name); if (number) printf("%d:", linenumber); printf("%s\n", buffer); } rc = 0; } } if (count_only) { if (name != NULL) printf("%s:", name); printf("%d\n", count); } return rc; } /************************************************* * Usage function * *************************************************/ static int usage (rc) int rc; { fprintf (stderr, _("Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n")); return rc; } /************************************************* * Main program * *************************************************/ int main (argc, argv) int argc; char **argv; { int i; int rc = 1; int options = 0; int errptr; char kind; const char *error; BOOL filenames = TRUE; #if HAVE_SETLOCALE /* Set locale according to user's wishes. */ setlocale (LC_ALL, ""); #endif #if ENABLE_NLS /* Tell program which translations to use and where to find. */ /* bindtextdomain (PACKAGE, LOCALEDIR); */ textdomain (PACKAGE); #endif /* Process the options */ kind = 'p'; for (i = 1; i < argc; i++) { char *s; if (argv[i][0] != '-') break; s = argv[i] + 1; while (*s != 0) { switch (*s++) { case 'c': count_only = TRUE; break; case 'b': kind = 'b'; break; case 'e': kind = 'e'; break; case 'p': kind = 'p'; break; case 'h': filenames = FALSE; break; case 'i': options |= PCRE_CASELESS; break; case 'l': filenames_only = TRUE; case 'n': number = TRUE; break; case 's': silent = TRUE; break; case 'v': invert = TRUE; break; case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break; default: fprintf (stderr, _("pcregrep: unknown option %c\n"), s[-1]); return usage (2); } } } /* There must be at least a regexp argument */ if (i >= argc) return usage (0); /* Compile the regular expression. */ switch (kind) { case 'b': pattern = pcre_posix_compile (argv[i++], options, &error, &errptr, NULL); break; case 'e': pattern = pcre_posix_compile (argv[i++], options | PCRE_EXTENDED, &error, &errptr, NULL); break; case 'p': pattern = pcre_compile (argv[i++], options, &error, &errptr, NULL); break; } if (pattern == NULL) { fprintf (stderr, _("pcregrep: error in regex at offset %d: %s\n"), errptr, error); return 2; } /* Study the regular expression, as we will be running it may times */ hints = pcre_study (pattern, 0, &error); if (error != NULL) { fprintf (stderr, _("pcregrep: error while studing regex: %s\n"), error); return 2; } /* If there are no further arguments, do the business on stdin and exit */ if (i >= argc) return pcregrep (stdin, NULL); /* Otherwise, work through the remaining arguments as files. If there is only one, don't give its name on the output. */ if (i == argc - 1) filenames = FALSE; if (filenames_only) filenames = TRUE; for (; i < argc; i++) { FILE *in = fopen (argv[i], "r"); if (in == NULL) { fprintf (stderr, _("pcregrep: failed to open %s: %s\n"), argv[i], strerror (errno)); rc = 2; } else { int frc = pcregrep (in, filenames ? argv[i] : NULL); if (frc == 0 && rc == 1) rc = 0; fclose (in); } } return rc; } sed-3.62/pcre/regcomp.c0000644000076600007660000006006410143133571011711 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* Include the internals header, which itself includes Standard C headers plus the external pcre header. */ #include "internal.h" /* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef inline, and there are *still* stupid compilers about that don't like indented pre-processor statements. I suppose it's only been 10 years... */ #ifdef DEBUG #define DPRINTF(p) printf p #define DFWRITE(p) fwrite p #else #define DPRINTF(p) /*nothing */ #define DFWRITE(p) /*nothing */ #endif /* Allow compilation as C++ source code, should anybody want to do that. */ #ifdef __cplusplus #define class pcre_class #endif /* Tables of names of POSIX character classes and their lengths. The list is terminated by a zero length entry. The first three must be alpha, upper, lower, as this is assumed for handling case independence. */ static const char *posix_names[] = { "alpha", "lower", "upper", "alnum", "ascii", "cntrl", "digit", "graph", "print", "punct", "space", "word", "xdigit", "blank" }; static const uschar posix_name_lengths[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 5, 0 }; static const int posix_class_maps[] = { cbit_lower, cbit_upper, -1, /* alpha */ cbit_lower, -1, -1, /* lower */ cbit_upper, -1, -1, /* upper */ cbit_digit, cbit_lower, cbit_upper, /* alnum */ cbit_print, cbit_cntrl, -1, /* ascii */ cbit_cntrl, -1, -1, /* cntrl */ cbit_digit, -1, -1, /* digit */ cbit_graph, -1, -1, /* graph */ cbit_print, -1, -1, /* print */ cbit_punct, -1, -1, /* punct */ cbit_space, -1, -1, /* space */ cbit_word, -1, -1, /* word */ cbit_xdigit, -1, -1, /* xdigit */ cbit_blank, -1, -1 /* blank */ }; /************************************************* * Check for counted repeat * *************************************************/ /* This function is called when a '{' is encountered in a place where it might start a quantifier. It looks ahead to see if it really is a quantifier or not. It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd} where the ddds are digits. Arguments: p pointer to the first char after '{' cd pointer to char tables block Returns: TRUE or FALSE */ static BOOL is_counted_repeat (p, cd) const uschar *p; compile_data *cd; { if (p > cd->end) return FALSE; if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE; while (p <= cd->end && (cd->ctypes[*p] & ctype_digit) != 0) p++; /* Check end of regexp */ if (p > cd->end) return FALSE; if (p == cd->end) return (*p == '}'); /* Not at end of regexp */ if (*p == '}') return TRUE; if (*p++ != ',') return FALSE; /* Check again for end of regexp */ if (p == cd->end) return (*p == '}'); if (*p == '}') return TRUE; if (p > cd->end) return FALSE; if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE; while (p <= cd->end && (cd->ctypes[*p] & ctype_digit) != 0) p++; return (p <= cd->end && *p == '}'); } /************************************************* * Read repeat counts * *************************************************/ /* Read an item of the form {n,m} and return the values. This is called only after is_counted_repeat() has confirmed that a repeat-count quantifier exists, so the syntax is guaranteed to be correct, but we need to check the values. Arguments: p pointer to first char after '{' minp pointer to int for min maxp pointer to int for max returned as -1 if no max errorptr points to pointer to error message cd pointer to character tables clock Returns: pointer to '}' on success; current ptr on error, with errorptr set */ static const uschar * read_repeat_counts (p, minp, maxp, errorptr, cd) const uschar *p; int *minp; int *maxp; const char **errorptr; compile_data *cd; { int min = 0; int max = -1; while ((cd->ctypes[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0'; if (*p == '}') max = min; else { if (*(++p) != '}') { max = 0; while ((cd->ctypes[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0'; if (max < min) { *errorptr = pcre_estrings[4]; return p; } } } min *= *minp; if (max > 0) max *= *maxp; /* Do paranoid checks, then fill in the required variables, and pass back the pointer to the terminating '}'. */ if (min > 65535 || max > 65535) *errorptr = pcre_estrings[5]; else { *minp = min; *maxp = max; } return p; } /************************************************* * Find the fixed length of a pattern * *************************************************/ /* Scan a pattern and compute the fixed length of subject that will match it, if the length is fixed. This is needed for dealing with backward assertions. Arguments: code points to the start of the pattern (the bracket) options the compiling options Returns: the fixed length, or -1 if there is no fixed length */ static int find_fixedlength (code, options) uschar *code; int options; { int length = -1; int branchlength = 0; uschar *cc = code + 3; /* Scan along the opcodes for this branch. If we get to the end of the branch, check the length against that of the other branches. */ for (;;) { int d; int op = *cc; if (op >= OP_BRA) op = OP_BRA; switch (op) { case OP_BRA: case OP_ONCE: case OP_COND: d = find_fixedlength (cc, options); if (d < 0) return -1; branchlength += d; do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT); cc += 3; break; /* Reached end of a branch; if it's a ket it is the end of a nested call. If it's ALT it is an alternation in a nested call. If it is END it's the end of the outer call. All can be handled by the same code. */ case OP_ALT: case OP_KET: case OP_KET_MAXSTAR: case OP_KET_MINSTAR: case OP_END: if (length < 0) length = branchlength; else if (length != branchlength) return -1; if (*cc != OP_ALT) return length; cc += 3; branchlength = 0; break; /* Skip over assertive subpatterns */ case OP_ASSERT: case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT); cc += 3; break; /* Skip over things that don't match chars */ case OP_REVERSE: case OP_BRANUMBER: case OP_CREF: cc++; /* Fall through */ case OP_OPT: cc++; /* Fall through */ case OP_SOD: case OP_EOD: case OP_EODN: case OP_CIRC: case OP_DOLL: case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: case OP_ANCHOR_MATCH: cc++; break; /* Handle char strings. */ case OP_CHARS: branchlength += *(++cc); cc += *cc + 1; break; /* Handle exact repetitions */ case OP_EXACT: case OP_TYPEEXACT: branchlength += (cc[1] << 8) + cc[2]; cc += 4; break; /* Handle single-char matchers */ case OP_TYPE: case OP_TYPENOT: branchlength++; cc += 2; break; case OP_ANY: branchlength++; cc++; break; /* Check a class for variable quantification */ case OP_CLASS: branchlength++; cc += 33; break; case OP_CL_MAXSTAR: case OP_CL_MINSTAR: case OP_CL_MAXQUERY: case OP_CL_MINQUERY: return -1; case OP_CL_MAXRANGE: case OP_CL_MINRANGE: cc += 33; if ((cc[1] << 8) + cc[2] != (cc[3] << 8) + cc[4]) return -1; branchlength += (cc[1] << 8) + cc[2]; cc += 4; break; /* Anything else is variable length */ default: return -1; } } /* Control never gets here */ } /************************************************* * Check for POSIX class syntax * *************************************************/ /* This function is called when the sequence "[:" or "[." or "[=" is encountered in a character class. It checks whether this is followed by an optional ^ and then a sequence of letters, terminated by a matching ":]" or ".]" or "=]". Argument: ptr pointer to the initial [ endptr where to return the end pointer cd pointer to compile data Returns: TRUE or FALSE */ static BOOL check_posix_syntax (ptr, endptr, cd) const uschar *ptr; const uschar **endptr; compile_data *cd; { int terminator; /* Don't combine these lines; the Solaris cc */ terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */ if (*(++ptr) == '^') ptr++; /* Use < because we have to look one character ahead */ while (ptr < cd->end && (cd->ctypes[*ptr] & ctype_letter) != 0) ptr++; if (ptr < cd->end && *ptr == terminator && ptr[1] == ']') { *endptr = ptr; return TRUE; } return FALSE; } /************************************************* * Check POSIX class name * *************************************************/ /* This function is called to check the name given in a POSIX-style class entry such as [:alnum:]. Arguments: ptr points to the first letter len the length of the name Returns: a value representing the name, or -1 if unknown */ static int check_posix_name (ptr, len) const uschar *ptr; int len; { int yield = 0; while (posix_name_lengths[yield] != 0) { if (len == posix_name_lengths[yield] && strncmp ((const char *) ptr, posix_names[yield], len) == 0) return yield; yield++; } return -1; } /************************************************* * Compile sequence of alternatives * *************************************************/ /* On entry, ptr is pointing past the bracket character, but on return it points to the closing bracket, or vertical bar, or end of string. The code variable is pointing at the byte into which the BRA operator has been stored. If the ims options are changed at the start (for a (?ims: group) or during any branch, we need to insert an OP_OPT item at the start of every following branch to ensure they get set correctly at run time, and also pass the new options into every subsequent branch compile. Argument: options the option bits optchanged new ims options to set as if (?ims) were at the start, or -1 for no change brackets -> int containing the number of capturing brackets used codeptr -> the address of the current code pointer ptrptr -> the address of the current pattern pointer errorptr -> pointer to error message lookbehind TRUE if this is a lookbehind assertion skipbytes skip this many bytes at start (for OP_COND, OP_BRANUMBER) reqchar -> place to put the last required character, or a negative number countlits -> place to put the shortest literal count of any branch cd points to the data block with tables pointers Returns: TRUE on success */ static BOOL compile_regex (options, optchanged, brackets, codeptr, ptrptr, errorptr, lookbehind, skipbytes, reqchar, countlits, cd, compile_branch_func) int options; int optchanged; int *brackets; uschar **codeptr; const uschar **ptrptr; const char **errorptr; BOOL lookbehind; int skipbytes; int *reqchar; int *countlits; compile_data *cd; BOOL (*compile_branch_func) (int, int *, uschar **, const uschar **, const char **, int *, int *, int *, compile_data *); { const uschar *ptr = *ptrptr; uschar *code = *codeptr; uschar *last_branch = code; uschar *start_bracket = code; uschar *reverse_count = NULL; int oldoptions = options & PCRE_IMS; int branchreqchar, branchcountlits; *reqchar = -1; *countlits = INT_MAX; code += 3 + skipbytes; /* Loop for each alternative branch */ for (;;) { int length; /* Handle change of options */ if (optchanged >= 0) { *code++ = OP_OPT; *code++ = optchanged; options = (options & ~PCRE_IMS) | optchanged; } /* Set up dummy OP_REVERSE if lookbehind assertion */ if (lookbehind) { *code++ = OP_REVERSE; reverse_count = code; *code++ = 0; *code++ = 0; } /* Now compile the branch */ if (!compile_branch_func (options, brackets, &code, &ptr, errorptr, &optchanged, &branchreqchar, &branchcountlits, cd)) { *ptrptr = ptr; return FALSE; } /* Fill in the length of the last branch */ length = code - last_branch; last_branch[1] = length >> 8; last_branch[2] = length & 255; /* Save the last required character if all branches have the same; a current value of -1 means unset, while -2 means "previous branch had no last required char". */ if (*reqchar != -2) { if (branchreqchar >= 0) { if (*reqchar == -1) *reqchar = branchreqchar; else if (*reqchar != branchreqchar) *reqchar = -2; } else *reqchar = -2; } /* Keep the shortest literal count */ if (branchcountlits < *countlits) *countlits = branchcountlits; DPRINTF (("literal count = %d min=%d\n", branchcountlits, *countlits)); /* If lookbehind, check that this branch matches a fixed-length string, and put the length into the OP_REVERSE item. Temporarily mark the end of the branch with OP_END. */ if (lookbehind) { *code = OP_END; length = find_fixedlength (last_branch, options); DPRINTF (("fixed length = %d\n", length)); if (length < 0) { *errorptr = pcre_estrings[25]; *ptrptr = ptr; return FALSE; } reverse_count[0] = (length >> 8); reverse_count[1] = length & 255; } /* Reached end of expression, either ')' or end of pattern. Insert a terminating ket and the length of the whole bracketed item, and return, leaving the pointer at the terminating char. If any of the ims options were changed inside the group, compile a resetting op-code following. */ if (ptr > cd->end || *ptr != '|') { length = code - start_bracket; *code++ = OP_KET; *code++ = length >> 8; *code++ = length & 255; if (optchanged >= 0) { *code++ = OP_OPT; *code++ = oldoptions; } *codeptr = code; *ptrptr = ptr; return TRUE; } /* Another branch follows; insert an "or" node and advance the pointer. */ *code = OP_ALT; last_branch = code; code += 3; ptr++; } /* Control never reaches here */ } /************************************************* * Find first significant op code * *************************************************/ /* This is called by several functions that scan a compiled expression looking for a fixed first character, or an anchoring op code etc. It skips over things that do not influence this. For one application, a change of caseless option is important. Arguments: code pointer to the start of the group options pointer to external options optbit the option bit whose changing is significant, or zero if none are optstop TRUE to return on option change, otherwise change the options value and continue Returns: pointer to the first significant opcode */ static const uschar * first_significant_code (code, options, optbit, optstop) const uschar *code; int *options; int optbit; BOOL optstop; { for (;;) { switch ((int) *code) { case OP_OPT: if (optbit > 0 && ((int) code[1] & optbit) != (*options & optbit)) { if (optstop) return code; *options = (int) code[1]; } code += 2; break; case OP_CREF: case OP_BRANUMBER: code += 3; break; case OP_WORD_BOUNDARY: case OP_NOT_WORD_BOUNDARY: code++; break; case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do code += (code[1] << 8) + code[2]; while (*code == OP_ALT); code += 3; break; default: return code; } } /* Control never reaches here */ } /************************************************* * Check for anchored expression * *************************************************/ /* Try to find out if this is an anchored regular expression. Consider each alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then it's anchored. However, if this is a multiline pattern, then only OP_SOD counts, since OP_CIRC can match in the middle. A branch is also implicitly anchored if it starts with .* and DOTALL is set, because that will try the rest of the pattern at all possible matching points, so there is no point trying them again. Arguments: code points to start of expression (the bracket) options points to the options setting Returns: TRUE or FALSE */ static BOOL is_anchored (code, options) const uschar *code; int *options; { do { const uschar *scode = first_significant_code (code + 3, options, PCRE_MULTILINE, FALSE); int op = *scode; if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) { if (!is_anchored (scode, options)) return FALSE; } else if ((op == OP_TYPE_MAXSTAR || op == OP_TYPE_MINSTAR) && (*options & PCRE_DOTALL) != 0) { if (scode[1] != OP_ANY) return FALSE; } else if (op != OP_SOD && op != OP_ANCHOR_MATCH && ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC)) return FALSE; code += (code[1] << 8) + code[2]; } while (*code == OP_ALT); return TRUE; } /************************************************* * Check for starting with ^ or .* * *************************************************/ /* This is called to find out if every branch starts with ^ or .* so that "first char" processing can be done to speed things up in multiline matching and for non-DOTALL patterns that start with .* (which must start at the beginning or after \n). Argument: points to start of expression (the bracket) Returns: TRUE or FALSE */ static BOOL is_startline (code) const uschar *code; { do { const uschar *scode = first_significant_code (code + 3, NULL, 0, FALSE); int op = *scode; if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) { if (!is_startline (scode)) return FALSE; } else if (op == OP_TYPE_MAXSTAR || op == OP_TYPE_MINSTAR) { if (scode[1] != OP_ANY) return FALSE; } else if (op != OP_CIRC) return FALSE; code += (code[1] << 8) + code[2]; } while (*code == OP_ALT); return TRUE; } /************************************************* * Check for ending with $ * *************************************************/ /* This is called to find out if every branch ends with $ so that if the match can only have a limited length we can start the match directly at the end of the line. Argument: points to start of expression (the bracket) Returns: TRUE or FALSE */ static BOOL is_endline (code) const uschar *code; { BOOL was_dollar = FALSE, is_dollar = FALSE, found_dollar = FALSE; for (;;) { int op; was_dollar = is_dollar; is_dollar = FALSE; op = *code; if (op >= OP_BRA) op = OP_BRA; switch (op) { case OP_EODN: case OP_EOD: found_dollar = is_dollar = TRUE; /* Fall through */ case OP_END: return found_dollar; case OP_OPT: code++; break; case OP_COND: code += 2; break; case OP_CREF: code++; break; case OP_CHARS: code += code[1] + 2; break; case OP_KET_MAXSTAR: case OP_KET_MINSTAR: case OP_ALT: case OP_KET: if (!was_dollar) return FALSE; case OP_ASSERT: case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ONCE: code += 2; break; case OP_REVERSE: code += 2; break; case OP_MAXSTAR: case OP_MINSTAR: case OP_MAXPLUS: case OP_MINPLUS: case OP_MAXQUERY: case OP_MINQUERY: case OP_TYPE_MAXSTAR: case OP_TYPE_MINSTAR: case OP_TYPE_MAXPLUS: case OP_TYPE_MINPLUS: case OP_TYPE_MAXQUERY: case OP_TYPE_MINQUERY: code++; break; case OP_EXACT: case OP_MAXUPTO: case OP_MINUPTO: code += 3; break; case OP_TYPEEXACT: case OP_TYPE_MAXUPTO: case OP_TYPE_MINUPTO: code += 3; break; case OP_NOT: code++; break; case OP_NOT_MAXSTAR: case OP_NOT_MINSTAR: case OP_NOT_MAXPLUS: case OP_NOT_MINPLUS: case OP_NOT_MAXQUERY: case OP_NOT_MINQUERY: code++; break; case OP_NOTEXACT: case OP_NOT_MAXUPTO: case OP_NOT_MINUPTO: code += 3; break; case OP_CL_MAXSTAR: case OP_CL_MINSTAR: case OP_CL_MAXPLUS: case OP_CL_MINPLUS: case OP_CL_MAXQUERY: case OP_CL_MINQUERY: case OP_CLASS: code += 32; break; case OP_CL_MAXRANGE: case OP_CL_MINRANGE: code += 36; break; case OP_REF: case OP_REF_MAXSTAR: case OP_REF_MINSTAR: case OP_REF_MAXPLUS: case OP_REF_MINPLUS: case OP_REF_MAXQUERY: case OP_REF_MINQUERY: code++; break; case OP_REF_MAXRANGE: case OP_REF_MINRANGE: code += 5; break; case OP_BRA: code += 3; break; /* Anything else is just a one-node item */ default: code++; break; } } } /************************************************* * Check for fixed first char * *************************************************/ /* Try to find out if there is a fixed first character. This is called for unanchored expressions, as it speeds up their processing quite considerably. Consider each alternative branch. If they all start with the same char, or with a bracket all of whose alternatives start with the same char (recurse ad lib), then we return that char, otherwise -1. Arguments: code points to start of expression (the bracket) options pointer to the options (used to check casing changes) Returns: -1 or the fixed first char */ static int find_firstchar (code, options) const uschar *code; int *options; { int c = -1; do { int d; const uschar *scode = first_significant_code (code + 3, options, PCRE_CASELESS, TRUE); int op = *scode; if (op >= OP_BRA) op = OP_BRA; switch (op) { default: return -1; case OP_BRA: case OP_ASSERT: case OP_ONCE: case OP_COND: if ((d = find_firstchar (scode, options)) < 0) return -1; if (c < 0) c = d; else if (c != d) return -1; break; case OP_EXACT: /* Fall through */ scode++; case OP_CHARS: /* Fall through */ scode++; case OP_MAXPLUS: case OP_MINPLUS: if (c < 0) c = scode[1]; else if (c != scode[1]) return -1; break; } code += (code[1] << 8) + code[2]; } while (*code == OP_ALT); return c; } sed-3.62/pcre/regdebug.c0000644000076600007660000002502610143133571012040 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ #include "internal.h" const char *pcre_OP_names[] = { "End", "\\<", "\\>", "\\G", "\\A", "\\B", "\\b", "\\Z", "\\z", "Opt", "^", "$", "Any", "chars", "*", "*?", " once *", "+", "+?", " once +", "?", "??", " once ?", "{", "{", " once {", "{", "not", "*", "*?", " once *", "+", "+?", " once +", "?", "??", " once ?", "{", "{", " once {", "{", "", "*", "*?", " once *", "+", "+?", " once +", "?", "??", " once ?", "{", "{", " once {", "{", "", "*", "*?", " once *", "+", "+?", " once +", "?", "??", " once ?", "{", "{", " once {", "{", "", "*", "*?", " once *", "+", "+?", " once +", "?", "??", " once ?", "{", "{", " once {", "", "*", "*?", " once *", "+", "+?", " once +", "?", "??", " once ?", "{", "{", " once {", "Recurse", "Alt", "Ket", "Ket*", "Ket*?", "Ket once *", "Assert", "Assert not", "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref", "Brazero", "Braminzero", "Branumber", "Bra" }; static const char *TYPE_names[] = { "invalid", "\\d", "\\s", "\\w" }; static const char *TYPENOT_names[] = { "Any", "\\D", "\\S", "\\W" }; /************************************************* * Debugging function to print regexp * *************************************************/ void pcre_debug (re) pcre *re; { uschar *code, *code_base; int c; printf ("Computed size = %d top_bracket = %d top_backref = %d\n", re->size, re->top_bracket, re->top_backref); if (re->max_match_size >= 0) printf ("Can match up to %d characters\n", re->max_match_size); if (re->options != 0) { printf ("%s%s%s%s%s%s%s%s\n", ((re->options & PCRE_ANCHORED) != 0) ? "anchored " : "", ((re->options & PCRE_CASELESS) != 0) ? "caseless " : "", ((re->options & PCRE_ICHANGED) != 0) ? "case state changed " : "", ((re->options & PCRE_MULTILINE) != 0) ? "multiline " : "", ((re->options & PCRE_DOTALL) != 0) ? "dotall " : "", ((re->options & PCRE_DOLLAR_ENDONLY) != 0) ? "endonly " : "", ((re->options & PCRE_EXTRA) != 0) ? "extra " : "", ((re->options & PCRE_UNGREEDY) != 0) ? "ungreedy" : ""); } if ((re->options & PCRE_FIRSTSET) != 0) { if (isascii (re->first_char) && isprint (re->first_char)) printf ("First char = %c\n", re->first_char); else printf ("First char = \\x%02x\n", re->first_char); } if ((re->options & PCRE_REQCHSET) != 0) { if (isascii (re->req_char) && isprint (re->req_char)) printf ("Req char = %c\n", re->req_char); else printf ("Req char = \\x%02x\n", re->req_char); } code_base = code = re->code; for (;;) { int charlength; printf ("%3d ", code - code_base); if (*code >= OP_BRA) { if (*code - OP_BRA > EXTRACT_BASIC_MAX) printf("%3d Bra extra", (code[1] << 8) + code[2]); else printf("%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA); code += 2; } else switch (*code) { case OP_OPT: printf (" %.2x %s", code[1], pcre_OP_names[*code]); code++; break; case OP_CHARS: charlength = *(++code); printf ("%3d ", charlength); while (charlength-- > 0) { c = *(++code); if (isascii (c) && isprint (c)) printf ("%c", c); else printf ("\\x%02x", c); } break; case OP_KET_MAXSTAR: case OP_KET_MINSTAR: case OP_KET_ONCESTAR: case OP_ALT: case OP_KET: case OP_ASSERT: case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ONCE: case OP_REVERSE: case OP_BRANUMBER: case OP_COND: case OP_CREF: printf ("%3d %s", (code[1] << 8) + code[2], pcre_OP_names[*code]); code += 2; break; case OP_MAXSTAR: case OP_MINSTAR: case OP_ONCESTAR: case OP_MAXPLUS: case OP_MINPLUS: case OP_ONCEPLUS: case OP_MAXQUERY: case OP_MINQUERY: case OP_ONCEQUERY: c = code[1]; if (isascii (c) && isprint (c)) printf (" %c", c); else printf (" \\x%02x", c); printf ("%s", pcre_OP_names[*code++]); break; case OP_TYPE: case OP_TYPE_MAXSTAR: case OP_TYPE_MINSTAR: case OP_TYPE_ONCESTAR: case OP_TYPE_MAXPLUS: case OP_TYPE_MINPLUS: case OP_TYPE_ONCEPLUS: case OP_TYPE_MAXQUERY: case OP_TYPE_MINQUERY: case OP_TYPE_ONCEQUERY: case OP_TYPENOT: case OP_TYPENOT_MAXSTAR: case OP_TYPENOT_MINSTAR: case OP_TYPENOT_ONCESTAR: case OP_TYPENOT_MAXPLUS: case OP_TYPENOT_MINPLUS: case OP_TYPENOT_ONCEPLUS: case OP_TYPENOT_MAXQUERY: case OP_TYPENOT_MINQUERY: case OP_TYPENOT_ONCEQUERY: c = code[1]; if (*code >= OP_TYPENOT) printf (" %s", TYPENOT_names[c]); else printf (" %s", TYPE_names[c]); printf ("%s", pcre_OP_names[*code]); code++; break; case OP_EXACT: case OP_MAXUPTO: case OP_MINUPTO: case OP_ONCEUPTO: c = code[3]; if (isascii (c) && isprint (c)) printf (" %c%s", c, pcre_OP_names[*code]); else printf (" \\x%02x%s", c, pcre_OP_names[*code]); if (*code != OP_EXACT) printf ("0,"); printf ("%d}", (code[1] << 8) + code[2]); if (*code == OP_MINUPTO) printf ("?"); code += 3; break; case OP_TYPEEXACT: case OP_TYPE_MAXUPTO: case OP_TYPE_MINUPTO: case OP_TYPE_ONCEUPTO: printf (" %s%s", TYPE_names[code[3]], pcre_OP_names[*code]); if (*code != OP_TYPEEXACT) printf (","); printf ("%d}", (code[1] << 8) + code[2]); if (*code == OP_TYPE_MINUPTO) printf ("?"); code += 3; break; case OP_TYPENOTEXACT: case OP_TYPENOT_MAXUPTO: case OP_TYPENOT_MINUPTO: case OP_TYPENOT_ONCEUPTO: printf (" %s%s", TYPENOT_names[code[3]], pcre_OP_names[*code]); if (*code != OP_TYPENOTEXACT) printf (","); printf ("%d}", (code[1] << 8) + code[2]); if (*code == OP_TYPENOT_MINUPTO) printf ("?"); code += 3; break; case OP_NOT: c = *(++code); if (isascii (c) && isprint (c)) printf (" [^%c]", c); else printf (" [^\\x%02x]", c); break; case OP_NOT_MAXSTAR: case OP_NOT_MINSTAR: case OP_NOT_ONCESTAR: case OP_NOT_MAXPLUS: case OP_NOT_MINPLUS: case OP_NOT_ONCEPLUS: case OP_NOT_MAXQUERY: case OP_NOT_MINQUERY: case OP_NOT_ONCEQUERY: c = code[1]; if (isascii (c) && isprint (c)) printf (" [^%c]", c); else printf (" [^\\x%02x]", c); printf ("%s", pcre_OP_names[*code++]); break; case OP_NOTEXACT: case OP_NOT_MAXUPTO: case OP_NOT_MINUPTO: case OP_NOT_ONCEUPTO: c = code[3]; if (isascii (c) && isprint (c)) printf (" [^%c]%s", c, pcre_OP_names[*code]); else printf (" [^\\x%02x]%s", c, pcre_OP_names[*code]); if (*code != OP_NOTEXACT) printf (","); printf ("%d}", (code[1] << 8) + code[2]); if (*code == OP_NOT_MINUPTO) printf ("?"); code += 3; break; case OP_REF: case OP_REF_MAXSTAR: case OP_REF_MINSTAR: case OP_REF_ONCESTAR: case OP_REF_MAXPLUS: case OP_REF_MINPLUS: case OP_REF_ONCEPLUS: case OP_REF_MAXQUERY: case OP_REF_MINQUERY: case OP_REF_ONCEQUERY: case OP_REF_MAXRANGE: case OP_REF_MINRANGE: case OP_REF_ONCERANGE: c = *code - OP_REF + OP_CLASS; printf (" \\%d", code[1] * 256 + code[2]); code += 2; goto CLASS_REF_REPEAT; case OP_CLASS: case OP_CL_MAXSTAR: case OP_CL_MINSTAR: case OP_CL_ONCESTAR: case OP_CL_MAXPLUS: case OP_CL_MINPLUS: case OP_CL_ONCEPLUS: case OP_CL_MAXQUERY: case OP_CL_MINQUERY: case OP_CL_ONCEQUERY: case OP_CL_MAXRANGE: case OP_CL_MINRANGE: case OP_CL_ONCERANGE: { int i, min, max; c = *code++; printf (" ["); for (i = 0; i < 256; i++) { if ((code[i / 8] & (1 << (i & 7))) != 0) { int j; for (j = i + 1; j < 256; j++) if ((code[j / 8] & (1 << (j & 7))) == 0) break; if (i == '-' || i == ']') printf ("\\"); if (isascii (i) && isprint (i)) printf ("%c", i); else printf ("\\x%02x", i); if (--j > i) { printf ("-"); if (j == '-' || j == ']') printf ("\\"); if (isascii (j) && isprint (j)) printf ("%c", j); else printf ("\\x%02x", j); } i = j; } } printf ("]"); code += 31; CLASS_REF_REPEAT: printf ("%s", pcre_OP_names[c]); if (c == OP_CL_MAXRANGE || c == OP_CL_MINRANGE || c == OP_CL_ONCERANGE || c == OP_REF_MAXRANGE || c == OP_REF_MINRANGE || c == OP_REF_ONCERANGE) { min = (code[1] << 8) + code[2]; max = (code[3] << 8) + code[4]; if (max == 0) printf ("%d,}", min); else printf ("%d,%d}", min, max); if (c == OP_CL_MINRANGE || c == OP_REF_MINRANGE) printf ("?"); code += 4; break; } } break; case OP_END: printf (" %s\n", pcre_OP_names[*code]); printf ("------------------------------------------------------------------\n"); return; /* Anything else is just a one-node item */ default: printf (" %s", pcre_OP_names[*code]); break; } code++; printf ("\n"); } } sed-3.62/pcre/regexec.c0000644000076600007660000016171410143133571011703 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* Include the internals header, which itself includes Standard C headers plus the external pcre header. */ #include "internal.h" /* Use a macro for debugging printing, 'cause that limits the use of #ifdef inline, and there are *still* stupid compilers about that don't like indented pre-processor statements. I suppose it's only been 10 years... */ #ifdef DEBUG #define DPRINTF(p) printf p #else #define DPRINTF(p) /*nothing */ #endif /* Allow compilation as C++ source code, should anybody want to do that. */ #ifdef __cplusplus #define class pcre_class #endif /* Structure for building a chain of data that actually lives on the stack, for holding the values of the subject pointer at the start of each subpattern, so as to detect when an empty string has been matched by a subpattern - to break infinite loops. */ typedef struct eptrblock { struct eptrblock *prev; const uschar *saved_eptr; int flags; } eptrblock; /* Flag bits for the match() function */ #define match_condassert 0x01 /* Called to check a condition assertion */ #define match_isgroup 0x02 /* Set if start of bracketed group */ #define match_isbrazero 0x04 /* Set if matching optional bracketed group */ /************************************************* * Macros and tables for character handling * *************************************************/ #define GETCHARINC(c, eptr) c = *eptr++; #define GETCHAR(c, eptr) c = *eptr; #ifdef DEBUG /************************************************* * Debugging function to print chars * *************************************************/ /* Print a sequence of chars in printable format, stopping at the end of the subject if the requested. Arguments: p points to characters length number to print is_subject TRUE if printing from within md->start_subject md pointer to matching data block, if is_subject is TRUE Returns: nothing */ static void pchars (p, length, is_subject, md) const uschar *p; int length; BOOL is_subject; match_data *md; { int c; if (is_subject && length > md->end_subject - p) length = md->end_subject - p; while (length-- > 0) if (isprint (c = *(p++))) printf ("%c", c); else printf ("\\x%02x", c); } #endif /************************************************* * Match a back-reference * *************************************************/ /* If a back reference hasn't been set, the length that is passed is greater than the number of characters left in the string, so the match fails. Arguments: offset index into the offset vector eptr points into the subject length length to be matched md points to match data block ims the ims flags Returns: TRUE if matched */ static BOOL match_ref (offset, eptr, length, md, ims) int offset; const uschar *eptr; int length; match_data *md; unsigned long int ims; { const uschar *p = md->start_subject + md->offset_vector[offset]; #ifdef DEBUG if (eptr >= md->end_subject) printf ("matching subject "); else { printf ("matching subject "); pchars (eptr, length, TRUE, md); } printf (" against backref "); pchars (p, length, FALSE, md); printf ("\n"); #endif /* Always fail if not enough characters left */ if (length > md->end_subject - eptr) return FALSE; /* Separate the caselesss case for speed */ if ((ims & PCRE_CASELESS) != 0) { while (length-- > 0) if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE; } else { while (length-- > 0) if (*p++ != *eptr++) return FALSE; } return TRUE; } /************************************************* * Match from current position * *************************************************/ /* On entry ecode points to the first opcode, and eptr to the first character in the subject string, while eptrb holds the value of eptr at the start of the last bracketed group - used for breaking infinite loops matching zero-length strings. Arguments: eptr pointer in subject ecode position in code offset_top current top pointer md pointer to "static" info for the match ims current /i, /m, and /s options eptrb pointer to chain of blocks containing eptr at start of brackets - for testing for empty matches flags can contain match_condassert - this is an assertion condition match_isgroup - this is the start of a bracketed group match_isbrazero - this is after a BRAZERO Returns: TRUE if matched */ static BOOL match (eptr, ecode, offset_top, md, ims, eptrb, flags) const uschar *eptr; const uschar *ecode; int offset_top; match_data *md; unsigned long int ims; eptrblock *eptrb; int flags; { unsigned long int original_ims = ims; /* Save for resetting on ')' */ const uschar *data; eptrblock newptrb; /* At the start of a bracketed group, add the current subject pointer to the stack of such pointers, to be re-instated at the end of the group when we hit the closing ket. When match() is called in other circumstances, we don't add to the stack. */ if ((flags & match_isgroup) != 0) { newptrb.prev = eptrb; newptrb.saved_eptr = eptr; newptrb.flags = flags; eptrb = &newptrb; } /* Now start processing the operations. */ for (;;) { int op = (int) *ecode; int min, max, ctype; int i; int c; int kind = 0; /* Opening capturing bracket. If there is space in the offset vector, save the current subject position in the working slot at the top of the vector. We mustn't change the current values of the data slot, because they may be set from a previous iteration of this group, and be referred to by a reference inside the group. If the bracket fails to match, we need to restore this value and also the values of the final offsets, in case they were set by a previous iteration of the same bracket. If there isn't enough space in the offset vector, treat this as if it were a non-capturing bracket. Don't worry about setting the flag for the error case here; that is handled in the code for KET. */ if (op > OP_BRA) { int offset; int number = op - OP_BRA; /* For extended extraction brackets (large number), we have to fish out the number from a dummy opcode at the start. */ if (number > EXTRACT_BASIC_MAX) number = (ecode[4] << 8) | ecode[5]; offset = number << 1; #ifdef DEBUG printf ("start bracket %d subject=", number); pchars (eptr, 16, TRUE, md); printf ("\n"); #endif if (offset < md->offset_max) { int save_offset1 = md->offset_vector[offset]; int save_offset2 = md->offset_vector[offset + 1]; int save_offset3 = md->offset_vector[md->offset_end - number]; DPRINTF (("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); md->offset_vector[md->offset_end - number] = eptr - md->start_subject; do { if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; ecode += (ecode[1] << 8) + ecode[2]; } while (*ecode == OP_ALT); DPRINTF (("bracket %d failed\n", number)); md->offset_vector[offset] = save_offset1; md->offset_vector[offset + 1] = save_offset2; md->offset_vector[md->offset_end - number] = save_offset3; return FALSE; } /* Insufficient room for saving captured contents */ else op = OP_BRA; } /* Other types of node can be handled by a switch */ switch (op) { case OP_BRA: /* Non-capturing bracket: optimized */ DPRINTF (("start bracket 0\n")); do { if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; ecode += (ecode[1] << 8) + ecode[2]; } while (*ecode == OP_ALT); DPRINTF (("bracket 0 failed\n")); return FALSE; /* Conditional group: compilation checked that there are no more than two branches. If the condition is false, skipping the first branch takes us past the end if there is only one branch, but that's OK because that is exactly what going to the ket would do. */ case OP_COND: if (ecode[3] == OP_CREF) /* Condition is extraction test */ { int offset = (ecode[4] << 9) | (ecode[5] << 1); /* Doubled reference number */ return match (eptr, ecode + ((offset < offset_top && md->offset_vector[offset] >= 0) ? 6 : 3 + (ecode[1] << 8) + ecode[2]), offset_top, md, ims, eptrb, match_isgroup); } /* The condition is an assertion. Call match() to evaluate it - setting the final argument TRUE causes it to stop at the end of an assertion. */ else { if (match (eptr, ecode + 3, offset_top, md, ims, NULL, match_condassert | match_isgroup)) { ecode += 3 + (ecode[4] << 8) + ecode[5]; while (*ecode == OP_ALT) ecode += (ecode[1] << 8) + ecode[2]; } else ecode += (ecode[1] << 8) + ecode[2]; return match (eptr, ecode + 3, offset_top, md, ims, eptrb, match_isgroup); } /* Control never reaches here */ /* Skip over conditional reference data or large extraction number data if encountered */ case OP_CREF: case OP_BRANUMBER: ecode += 3; continue; /* End of the pattern. If PCRE_NOTEMPTY is set, fail if we have matched an empty string - recursion will then try other alternatives, if any. */ case OP_END: if (md->notempty && eptr == md->start_match) return FALSE; md->end_match_ptr = eptr; /* Record where we ended */ md->end_offset_top = offset_top; /* and how many extracts were taken */ return TRUE; /* Change option settings */ case OP_OPT: ims = ecode[1]; ecode += 2; DPRINTF (("ims set to %02lx\n", ims)); continue; /* Assertion brackets. Check the alternative branches in turn - the matching won't pass the KET for an assertion. If any one branch matches, the assertion is true. Lookbehind assertions have an OP_REVERSE item at the start of each branch to move the current point backwards, so the code at this level is identical to the lookahead case. */ case OP_ASSERT: case OP_ASSERTBACK: do { if (match (eptr, ecode + 3, offset_top, md, ims, NULL, match_isgroup)) break; ecode += (ecode[1] << 8) + ecode[2]; } while (*ecode == OP_ALT); if (*ecode == OP_KET) return FALSE; /* If checking an assertion for a condition, return TRUE. */ if ((flags & match_condassert) != 0) return TRUE; /* Continue from after the assertion, updating the offsets high water mark, since extracts may have been taken during the assertion. */ do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); ecode += 3; offset_top = md->end_offset_top; continue; /* Negative assertion: all branches must fail to match */ case OP_ASSERT_NOT: case OP_ASSERTBACK_NOT: do { if (match (eptr, ecode + 3, offset_top, md, ims, NULL, match_isgroup)) return FALSE; ecode += (ecode[1] << 8) + ecode[2]; } while (*ecode == OP_ALT); if ((flags & match_condassert) != 0) return TRUE; ecode += 3; continue; /* Move the subject pointer back. This occurs only at the start of each branch of a lookbehind assertion. If we are too close to the start to move back, this match function fails. */ case OP_REVERSE: eptr -= (ecode[1] << 8) + ecode[2]; if (eptr < md->start_subject) return FALSE; ecode += 3; continue; /* Recursion matches the current regex, nested. If there are any capturing brackets started but not finished, we have to save their starting points and reinstate them after the recursion. However, we don't know how many such there are (offset_top records the completed total) so we just have to save all the potential data. There may be up to 99 such values, which is a bit large to put on the stack, but using malloc for small numbers seems expensive. As a compromise, the stack is used when there are fewer than 16 values to store; otherwise malloc is used. A problem is what to do if the malloc fails ... there is no way of returning to the top level with an error. Save the top 15 values on the stack, and accept that the rest may be wrong. */ case OP_RECURSE: { BOOL rc; int *save; int stacksave[15]; c = md->offset_max; if (c < 16) save = stacksave; else { save = (int *) (pcre_malloc) ((c + 1) * sizeof (int)); if (save == NULL) { save = stacksave; c = 15; } } for (i = 1; i <= c; i++) save[i] = md->offset_vector[md->offset_end - i]; rc = match (eptr, md->start_pattern, offset_top, md, ims, eptrb, match_isgroup); for (i = 1; i <= c; i++) md->offset_vector[md->offset_end - i] = save[i]; if (save != stacksave) (pcre_free) (save); if (!rc) return FALSE; /* In case the recursion has set more capturing values, save the final number, then move along the subject till after the recursive match, and advance one byte in the pattern code. */ offset_top = md->end_offset_top; eptr = md->end_match_ptr; ecode++; } continue; /* "Once" brackets are like assertion brackets except that after a match, the point in the subject string is not moved back. Thus there can never be a move back into the brackets. Check the alternative branches in turn - the matching won't pass the KET for this kind of subpattern. If any one branch matches, we carry on as at the end of a normal bracket, leaving the subject pointer. */ case OP_ONCE: { const uschar *prev = ecode; const uschar *saved_eptr = eptr; do { if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, match_isgroup)) break; ecode += (ecode[1] << 8) + ecode[2]; } while (*ecode == OP_ALT); /* If hit the end of the group (which could be repeated), fail */ if (*ecode != OP_ONCE && *ecode != OP_ALT) return FALSE; /* Continue as from after the assertion, updating the offsets high water mark, since extracts may have been taken. */ do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); offset_top = md->end_offset_top; eptr = md->end_match_ptr; /* For a non-repeating ket, just continue at this level. This also happens for a repeating ket if no characters were matched in the group. This is the forcible breaking of infinite loops as implemented in Perl 5.005. If there is an options reset, it will get obeyed in the normal course of events. */ if (*ecode == OP_KET || eptr == saved_eptr) { ecode += 3; continue; } /* The repeating kets try the rest of the pattern or restart from the preceding bracket, in the appropriate order. We need to reset any options that changed within the bracket before re-running it, so check the next opcode. */ if (ecode[3] == OP_OPT) { ims = (ims & ~PCRE_IMS) | ecode[4]; DPRINTF (("ims set to %02lx at group repeat\n", ims)); } if (*ecode == OP_KET_MINSTAR) { if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, 0) || match (eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; } else /* OP_KET_MAXSTAR or OP_KET_ONCESTAR (FIXME!) */ { if (match (eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || match (eptr, ecode + 3, offset_top, md, ims, eptrb, 0)) return TRUE; } } return FALSE; /* An alternation is the end of a branch; scan along to find the end of the bracketed group and go to there. */ case OP_ALT: do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); continue; /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating that it may occur zero times. It may repeat infinitely, or not at all - i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper repeat limits are compiled as a number of copies, with the optional ones preceded by BRAZERO or BRAMINZERO. */ case OP_BRAZERO: { const uschar *next = ecode + 1; if (match (eptr, next, offset_top, md, ims, eptrb, match_isgroup | match_isbrazero)) return TRUE; do next += (next[1] << 8) + next[2]; while (*next == OP_ALT); ecode = next + 3; } continue; case OP_BRAMINZERO: { const uschar *next = ecode + 1; do next += (next[1] << 8) + next[2]; while (*next == OP_ALT); if (match (eptr, next + 3, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; ecode++; } continue; /* End of a group, repeated or non-repeating. If we are at the end of an assertion "group", stop matching and return TRUE, but record the current high water mark for use by positive assertions. Do this also for the "once" (not-backup up) groups. */ case OP_KET: case OP_KET_MINSTAR: case OP_KET_MAXSTAR: case OP_KET_ONCESTAR: { const uschar *prev = ecode - (ecode[1] << 8) - ecode[2]; const uschar *saved_eptr = eptrb->saved_eptr; eptrb = eptrb->prev; /* Back up the stack of bracket start pointers */ if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT || *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT || *prev == OP_ONCE) { md->end_match_ptr = eptr; /* For ONCE */ md->end_offset_top = offset_top; return TRUE; } /* In all other cases except a conditional group we have to check the group number back at the start and if necessary complete handling an extraction by setting the offsets and bumping the high water mark. */ if (*prev != OP_COND) { int offset; int number = *prev - OP_BRA; /* For extended extraction brackets (large number), we have to fish out the number from a dummy opcode at the start. */ if (number > EXTRACT_BASIC_MAX) number = (prev[4] << 8) | prev[5]; offset = number << 1; #ifdef DEBUG printf ("end bracket %d\n", number); #endif /* Void matches (eptr == saved_eptr) are reported if they are the first ones (md->offset_vector[offset] is still -1) or if the match is not optional (the match_isbrazero flag is not active). */ if (number > 0 && (eptr > saved_eptr || offset_top <= offset || md->offset_vector[offset] == -1 || !(eptrb->flags & match_isbrazero))) { if (offset >= md->offset_max) md->offset_overflow = TRUE; { if (offset_top <= offset) offset_top = offset + 2; md->offset_vector[offset] = md->offset_vector[md->offset_end - number]; md->offset_vector[offset + 1] = eptr - md->start_subject; } } } /* Reset the value of the ims flags, in case they got changed during the group. */ ims = original_ims; DPRINTF (("ims reset to %02lx\n", ims)); /* For a non-repeating ket, just continue at this level. This also happens for a repeating ket if no characters were matched in the group. This is the forcible breaking of infinite loops as implemented in Perl 5.005. If there is an options reset, it will get obeyed in the normal course of events. */ if (*ecode == OP_KET || eptr == saved_eptr) { ecode += 3; continue; } /* The repeating kets try the rest of the pattern or restart from the preceding bracket, in the appropriate order. */ if (*ecode == OP_KET_MINSTAR) { if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, 0) || match (eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; } else /* OP_KET_MAXSTAR or OP_KET_ONCESTAR (FIXME!) */ { if (match (eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || match (eptr, ecode + 3, offset_top, md, ims, eptrb, 0)) return TRUE; } } return FALSE; /* Start of subject unless notbol, or after internal newline if multiline */ case OP_CIRC: if (md->notbol && eptr == md->start_subject) return FALSE; if ((ims & PCRE_MULTILINE) != 0) { if (eptr != md->start_subject && eptr[-1] != '\n') return FALSE; ecode++; continue; } /* ... else fall through */ /* Start of subject assertion */ case OP_SOD: if (eptr != md->start_subject) return FALSE; ecode++; continue; /* No implicit advancing assertion */ case OP_ANCHOR_MATCH: if (eptr != md->first_start) return FALSE; ecode++; continue; /* Assert before internal newline if multiline, or before a terminating newline unless endonly is set, else end of subject unless noteol is set. */ case OP_DOLL: if ((ims & PCRE_MULTILINE) != 0) { if (eptr < md->end_subject) { if (*eptr != '\n') return FALSE; } else { if (md->noteol) return FALSE; } ecode++; continue; } else { if (md->noteol) return FALSE; if (!md->endonly) { if (eptr < md->end_subject - 1 || (eptr == md->end_subject - 1 && *eptr != '\n')) return FALSE; ecode++; continue; } } /* ... else fall through */ /* End of subject assertion (\z) */ case OP_EOD: if (eptr < md->end_subject) return FALSE; ecode++; continue; /* End of subject or ending \n assertion (\Z) */ case OP_EODN: if (eptr < md->end_subject - 1 || (eptr == md->end_subject - 1 && *eptr != '\n')) return FALSE; ecode++; continue; /* Word boundary assertions */ case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: { BOOL prev_is_word = (eptr != md->start_subject) && ((md->ctypes[eptr[-1]] & ctype_word) != 0); BOOL cur_is_word = (eptr < md->end_subject) && ((md->ctypes[*eptr] & ctype_word) != 0); if ((*ecode++ == OP_WORD_BOUNDARY) ? cur_is_word == prev_is_word : cur_is_word != prev_is_word) return FALSE; } continue; case OP_BEG_WORD: case OP_END_WORD: { BOOL prev_is_word = (eptr != md->start_subject) && ((md->ctypes[eptr[-1]] & ctype_word) != 0); BOOL cur_is_word = (eptr < md->end_subject) && ((md->ctypes[*eptr] & ctype_word) != 0); if (cur_is_word == prev_is_word || ((*ecode++ == OP_BEG_WORD) ? prev_is_word : cur_is_word)) return FALSE; } continue; /* Match a single character type; inline for speed */ case OP_ANY: if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == '\n') return FALSE; if (eptr++ >= md->end_subject) return FALSE; ecode++; continue; case OP_TYPE: ctype = 1 << ecode[1]; /* Code for the character type */ if (eptr >= md->end_subject || (md->ctypes[*eptr++] & ctype) == 0) return FALSE; ecode += 2; continue; case OP_TYPENOT: ctype = ecode[1]; /* Code for the character type */ if (ctype != 0 || !(ims & PCRE_DOTALL)) ctype = 1 << ctype; if (eptr >= md->end_subject || !(md->ctypes[*eptr++] & ctype) == 0) return FALSE; ecode += 2; continue; /* Match a back reference, possibly repeatedly. Look past the end of the item to see if there is repeat information following. The code is similar to that for character classes, but repeated for efficiency. Then obey similar code to character type repeats - written out again for speed. However, if the referenced string is the empty string, always treat it as matched, any number of times (otherwise there could be infinite loops). */ case OP_REF: { int length; int offset = (ecode[1] << 9) | (ecode[2] << 1); /* Doubled reference number */ ecode += 3; /* Advance past the item */ /* If the reference is unset, set the length to be longer than the amount of subject left; this ensures that every attempt at a match fails. We can't just fail here, because of the possibility of quantifiers with zero minima. */ length = (offset >= offset_top || md->offset_vector[offset] < 0) ? md->end_subject - eptr + 1 : md->offset_vector[offset + 1] - md->offset_vector[offset]; if (!match_ref (offset, eptr, length, md, ims)) return FALSE; eptr += length; continue; /* With the main loop */ } case OP_REF_MAXSTAR: case OP_REF_MINSTAR: case OP_REF_ONCESTAR: data = ecode; kind = *ecode++ - OP_REF_MAXSTAR; min = 0, max = INT_MAX; goto REPEATREF; case OP_REF_MAXPLUS: case OP_REF_MINPLUS: case OP_REF_ONCEPLUS: data = ecode; kind = *ecode++ - OP_REF_MAXPLUS; min = 1, max = INT_MAX; goto REPEATREF; case OP_REF_MAXQUERY: case OP_REF_MINQUERY: case OP_REF_ONCEQUERY: data = ecode; kind = *ecode++ - OP_REF_MAXQUERY; min = 0, max = 1; goto REPEATREF; case OP_REF_MAXRANGE: case OP_REF_MINRANGE: case OP_REF_ONCERANGE: data = ecode; kind = *ecode++ - OP_REF_MINRANGE; min = (ecode[2] << 8) + ecode[3]; max = (ecode[4] << 8) + ecode[5]; ecode += 4; REPEATREF: { int length; int offset = (data[1] << 9) | (data[2] << 1); /* Doubled reference number */ ecode += 2; /* Advance past the item */ if (max == 0) max = INT_MAX; /* If the reference is unset, set the length to be longer than the amount of subject left; this ensures that every attempt at a match fails. We can't just fail here, because of the possibility of quantifiers with zero minima. */ length = (offset >= offset_top || md->offset_vector[offset] < 0) ? md->end_subject - eptr + 1 : md->offset_vector[offset + 1] - md->offset_vector[offset]; /* If the length of the reference is zero, just continue with the main loop. */ if (length == 0) continue; /* First, ensure the minimum number of matches are present. */ for (i = 1; i <= min; i++) { if (!match_ref (offset, eptr, length, md, ims)) return FALSE; eptr += length; } /* If min = max, continue at the same level without recursion. They are not both allowed to be zero. */ if (min == max) continue; /* If minimizing, keep trying and advancing the pointer */ if (kind == KIND_MIN) { for (i = min;; i++) { if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || !match_ref (offset, eptr, length, md, ims)) return FALSE; eptr += length; } /* Control never gets here */ } /* If maximizing, find the longest string and work backwards */ else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (!match_ref (offset, eptr, length, md, ims)) break; eptr += length; } if (kind == KIND_MAX) { while (eptr >= pp) { if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; eptr -= length; } return FALSE; } } } continue; /* Match a character class, possibly repeatedly. Look past the end of the item to see if there is repeat information following. Then obey similar code to character type repeats - written out again for speed. */ case OP_CLASS: { data = ecode + 1; /* Save for matching */ ecode += 33; /* Advance past the item */ if (eptr >= md->end_subject) return FALSE; GETCHARINC (c, eptr) /* Get character; increment eptr */ if ((data[c / 8] & (1 << (c & 7))) == 0) return FALSE; } continue; case OP_CL_MAXSTAR: case OP_CL_MINSTAR: case OP_CL_ONCESTAR: kind = *ecode++ - OP_CL_MAXSTAR; data = ecode; min = 0, max = INT_MAX; goto REPEATCLASS; case OP_CL_MAXPLUS: case OP_CL_MINPLUS: case OP_CL_ONCEPLUS: kind = *ecode++ - OP_CL_MAXPLUS; data = ecode; min = 1, max = INT_MAX; goto REPEATCLASS; case OP_CL_MAXQUERY: case OP_CL_MINQUERY: case OP_CL_ONCEQUERY: kind = *ecode++ - OP_CL_MAXQUERY; data = ecode; min = 0, max = 1; goto REPEATCLASS; case OP_CL_MAXRANGE: case OP_CL_MINRANGE: case OP_CL_ONCERANGE: kind = *ecode++ - OP_CL_MAXRANGE; data = ecode; min = (ecode[32] << 8) + ecode[33]; max = (ecode[34] << 8) + ecode[35]; ecode += 4; REPEATCLASS: ecode += 32; /* Advance past the item */ if (max == 0) max = INT_MAX; /* First, ensure the minimum number of matches are present. */ for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) return FALSE; GETCHARINC (c, eptr) /* Get character; increment eptr */ if ((data[c / 8] & (1 << (c & 7))) != 0) continue; return FALSE; } /* If max == min we can continue with the main loop without the need to recurse. */ if (min == max) continue; /* If minimizing, keep testing the rest of the expression and advancing the pointer while it matches the class. */ if (kind == KIND_MIN) { for (i = min;; i++) { if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject) return FALSE; GETCHARINC (c, eptr) /* Get character; increment eptr */ if ((data[c / 8] & (1 << (c & 7))) != 0) continue; return FALSE; } /* Control never gets here */ } /* If maximizing, find the longest possible run, then work backwards. */ else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; GETCHAR (c, eptr) /* Get character */ if ((data[c / 8] & (1 << (c & 7))) == 0) break; eptr++; } if (kind == KIND_MAX) { while (eptr >= pp) { if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; } return FALSE; } } continue; /* Match a run of characters */ case OP_CHARS: { int length = ecode[1]; ecode += 2; #ifdef DEBUG if (eptr >= md->end_subject) printf ("matching subject against pattern "); else { printf ("matching subject "); pchars (eptr, length, TRUE, md); printf (" against pattern "); } pchars (ecode, length, FALSE, md); printf ("\n"); #endif if (length > md->end_subject - eptr) return FALSE; if ((ims & PCRE_CASELESS) != 0) { while (length-- > 0) if (md->lcc[*ecode++] != md->lcc[*eptr++]) return FALSE; } else { while (length-- > 0) if (*ecode++ != *eptr++) return FALSE; } } continue; /* Match a single character repeatedly; different opcodes share code. */ case OP_EXACT: min = max = (ecode[1] << 8) + ecode[2]; ecode += 3; goto REPEATCHAR; case OP_MAXUPTO: case OP_MINUPTO: case OP_ONCEUPTO: min = 0; max = (ecode[1] << 8) + ecode[2]; kind = *ecode - OP_MAXUPTO; ecode += 3; goto REPEATCHAR; case OP_MAXSTAR: case OP_MINSTAR: case OP_ONCESTAR: kind = *ecode++ - OP_MAXSTAR; min = 0, max = INT_MAX; goto REPEATCHAR; case OP_MAXPLUS: case OP_MINPLUS: case OP_ONCEPLUS: kind = *ecode++ - OP_MAXPLUS; min = 1, max = INT_MAX; goto REPEATCHAR; case OP_MAXQUERY: case OP_MINQUERY: case OP_ONCEQUERY: kind = *ecode++ - OP_MAXQUERY; min = 0, max = 1; /* Common code for all repeated single-character matches. We can give up quickly if there are fewer than the minimum number of characters left in the subject. */ REPEATCHAR: if (min > md->end_subject - eptr) return FALSE; c = *ecode++; /* The code is duplicated for the caseless and caseful cases, for speed, since matching characters is likely to be quite common. First, ensure the minimum number of matches are present. If min = max, continue at the same level without recursing. Otherwise, if minimizing, keep trying the rest of the expression and advancing one matching character if failing, up to the maximum. Alternatively, if maximizing, find the maximum number of characters and work backwards. */ DPRINTF (("matching %c{%d,%d} against subject %.*s\n", c, min, max, max, eptr)); if ((ims & PCRE_CASELESS) != 0) { c = md->lcc[c]; for (i = 1; i <= min; i++) if (c != md->lcc[*eptr++]) return FALSE; if (min == max) continue; if (kind == KIND_MIN) { for (i = min;; i++) { if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject || c != md->lcc[*eptr++]) return FALSE; } /* Control never gets here */ } else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || c != md->lcc[*eptr]) break; eptr++; } if (kind == KIND_MAX) { while (eptr >= pp) if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; return FALSE; } } } /* Caseful comparisons */ else { for (i = 1; i <= min; i++) if (c != *eptr++) return FALSE; if (min == max) continue; if (kind == KIND_MIN) { for (i = min;; i++) { if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject || c != *eptr++) return FALSE; } /* Control never gets here */ } else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || c != *eptr) break; eptr++; } if (kind == KIND_MAX) { while (eptr >= pp) if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; return FALSE; } } } continue; /* Match a negated single character */ case OP_NOT: if (eptr >= md->end_subject) return FALSE; ecode++; if ((ims & PCRE_CASELESS) != 0) { if (md->lcc[*ecode++] == md->lcc[*eptr++]) return FALSE; } else { if (*ecode++ == *eptr++) return FALSE; } continue; /* Match a negated single character repeatedly. This is almost a repeat of the code for a repeated single character, but I haven't found a nice way of commoning these up that doesn't require a test of the positive/negative option for each character match. Maybe that wouldn't add very much to the time taken, but character matching *is* what this is all about... */ case OP_NOTEXACT: min = max = (ecode[1] << 8) + ecode[2]; ecode += 3; goto REPEATNOTCHAR; case OP_NOT_MAXUPTO: case OP_NOT_MINUPTO: case OP_NOT_ONCEUPTO: min = 0; max = (ecode[1] << 8) + ecode[2]; kind = *ecode - OP_NOT_MAXUPTO; ecode += 3; goto REPEATNOTCHAR; case OP_NOT_MAXSTAR: case OP_NOT_MINSTAR: case OP_NOT_ONCESTAR: kind = *ecode++ - OP_NOT_MAXSTAR; min = 0, max = INT_MAX; goto REPEATNOTCHAR; case OP_NOT_MAXPLUS: case OP_NOT_MINPLUS: case OP_NOT_ONCEPLUS: kind = *ecode++ - OP_NOT_MAXPLUS; min = 1, max = INT_MAX; goto REPEATNOTCHAR; case OP_NOT_MAXQUERY: case OP_NOT_MINQUERY: case OP_NOT_ONCEQUERY: kind = *ecode++ - OP_NOT_MAXQUERY; min = 0, max = 1; /* Common code for all repeated single-character matches. We can give up quickly if there are fewer than the minimum number of characters left in the subject. */ REPEATNOTCHAR: if (min > md->end_subject - eptr) return FALSE; c = *ecode++; /* The code is duplicated for the caseless and caseful cases, for speed, since matching characters is likely to be quite common. First, ensure the minimum number of matches are present. If min = max, continue at the same level without recursing. Otherwise, if minimizing, keep trying the rest of the expression and advancing one matching character if failing, up to the maximum. Alternatively, if maximizing, find the maximum number of characters and work backwards. */ DPRINTF (("negative matching %c{%d,%d} against subject %.*s\n", c, min, max, max, eptr)); if ((ims & PCRE_CASELESS) != 0) { c = md->lcc[c]; for (i = 1; i <= min; i++) if (c == md->lcc[*eptr++]) return FALSE; if (min == max) continue; if (kind == KIND_MIN) { for (i = min;; i++) { if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject || c == md->lcc[*eptr++]) return FALSE; } /* Control never gets here */ } else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || c == md->lcc[*eptr]) break; eptr++; } if (kind == KIND_MAX) { while (eptr >= pp) if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; return FALSE; } } } /* Caseful comparisons */ else { for (i = 1; i <= min; i++) if (c == *eptr++) return FALSE; if (min == max) continue; if (kind == KIND_MIN) { for (i = min;; i++) { if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject || c == *eptr++) return FALSE; } /* Control never gets here */ } else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || c == *eptr) break; eptr++; } if (kind == KIND_MAX) { while (eptr >= pp) if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; return FALSE; } } } continue; /* Match a single character type repeatedly; several different opcodes share code. This is very similar to the code for single characters, but we repeat it in the interests of efficiency. */ case OP_TYPEEXACT: min = max = (ecode[1] << 8) + ecode[2]; kind = OP_TYPE_ONCEUPTO - OP_TYPE_MAXUPTO; ecode += 3; goto REPEATTYPE; case OP_TYPE_MAXUPTO: case OP_TYPE_MINUPTO: case OP_TYPE_ONCEUPTO: min = 0; max = (ecode[1] << 8) + ecode[2]; kind = *ecode - OP_TYPE_MAXUPTO; ecode += 3; goto REPEATTYPE; case OP_TYPE_MAXSTAR: case OP_TYPE_MINSTAR: case OP_TYPE_ONCESTAR: kind = *ecode++ - OP_TYPE_MAXSTAR; min = 0, max = INT_MAX; goto REPEATTYPE; case OP_TYPE_MAXPLUS: case OP_TYPE_MINPLUS: case OP_TYPE_ONCEPLUS: kind = *ecode++ - OP_TYPE_MAXPLUS; min = 1, max = INT_MAX; goto REPEATTYPE; case OP_TYPE_MAXQUERY: case OP_TYPE_MINQUERY: case OP_TYPE_ONCEQUERY: kind = *ecode++ - OP_TYPE_MAXQUERY; min = 0, max = 1; /* Common code for all repeated single character type matches */ REPEATTYPE: ctype = 1 << *ecode++; /* Code for the character type */ /* First, ensure the minimum number of matches are present. Use inline code for maximizing the speed, and do the type test once at the start (i.e. keep it out of the loop). Also we can test that there are at least the minimum number of bytes before we start. */ if (min > md->end_subject - eptr) return FALSE; if (min > 0) { for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype) == 0) return FALSE; } /* If min = max, continue at the same level without recursing */ if (min == max) continue; /* If minimizing, we have to test the rest of the pattern before each subsequent match. */ if (kind == KIND_MIN) { for (i = min;; i++) { if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject) return FALSE; if ((md->ctypes[*eptr++] & ctype) == 0) return FALSE; } /* Control never gets here */ } /* If maximizing it is worth using inline code for speed, doing the type test once at the start (i.e. keep it out of the loop). */ else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype) == 0) break; eptr++; } if (kind == KIND_MAX) { while (eptr >= pp) { if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; } return FALSE; } } continue; /* Match a single character type repeatedly; several different opcodes share code. This is very similar to the code for single characters, but we repeat it in the interests of efficiency. */ case OP_TYPENOTEXACT: min = max = (ecode[1] << 8) + ecode[2]; kind = OP_TYPENOT_ONCEUPTO - OP_TYPENOT_MAXUPTO; ecode += 3; goto REPEATTYPENOT; case OP_TYPENOT_MAXUPTO: case OP_TYPENOT_MINUPTO: case OP_TYPENOT_ONCEUPTO: min = 0; max = (ecode[1] << 8) + ecode[2]; kind = *ecode - OP_TYPENOT_MAXUPTO; ecode += 3; goto REPEATTYPENOT; case OP_TYPENOT_MAXSTAR: case OP_TYPENOT_MINSTAR: case OP_TYPENOT_ONCESTAR: kind = *ecode++ - OP_TYPENOT_MAXSTAR; min = 0, max = INT_MAX; goto REPEATTYPENOT; case OP_TYPENOT_MAXPLUS: case OP_TYPENOT_MINPLUS: case OP_TYPENOT_ONCEPLUS: kind = *ecode++ - OP_TYPENOT_MAXPLUS; min = 1, max = INT_MAX; goto REPEATTYPENOT; case OP_TYPENOT_MAXQUERY: case OP_TYPENOT_MINQUERY: case OP_TYPENOT_ONCEQUERY: kind = *ecode++ - OP_TYPENOT_MAXQUERY; min = 0, max = 1; /* Common code for all repeated single character type matches */ REPEATTYPENOT: ctype = *ecode++; /* Code for the character type */ if (ctype != 0 || !(ims & PCRE_DOTALL)) ctype = 1 << ctype; /* First, ensure the minimum number of matches are present. Use inline code for maximizing the speed, and do the type test once at the start (i.e. keep it out of the loop). Also we can test that there are at least the minimum number of bytes before we start. */ if (min > md->end_subject - eptr) return FALSE; if (min > 0) { for (i = 1; i <= min; i++) if (md->ctypes[*eptr++] & ctype) return FALSE; } /* If min = max, continue at the same level without recursing */ if (min == max) continue; /* If minimizing, we have to test the rest of the pattern before each subsequent match. */ if (kind == KIND_MIN) { for (i = min;; i++) { if (match (eptr, ecode, offset_top, md, ims, eptrb, 0) != 0) return TRUE; if (i >= max || eptr >= md->end_subject) return FALSE; if (md->ctypes[*eptr++] & ctype) return FALSE; } /* Control never gets here */ } /* If maximizing it is worth using inline code for speed, doing the type test once at the start (i.e. keep it out of the loop). */ else { const uschar *pp = eptr; if (ctype == 0) { c = max - min; if (c > md->end_subject - eptr) c = md->end_subject - eptr; eptr += c; } else for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype)) break; eptr++; } if (kind == KIND_MAX) { while (eptr >= pp) { if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; } return FALSE; } } continue; /* There's been some horrible disaster. */ default: DPRINTF (("Unknown opcode %d\n", *ecode)); md->errorcode = PCRE_ERROR_UNKNOWN_NODE; return FALSE; } /* Do not stick any code in here without much thought; it is assumed that "continue" in the code above comes out to here to repeat the main loop. */ } /* End of main loop */ /* Control never reaches here */ } /************************************************* * Execute a Regular Expression * *************************************************/ /* This function applies a compiled re to a subject string and picks out portions of the string if it matches. Two elements in the vector are set for each substring: the offsets to the start and end of the substring. Arguments: external_re points to the compiled expression external_extra points to "hints" from pcre_study() or is NULL subject points to the subject string length length of subject string (may contain binary zeros) start_offset where to start in the subject string options option bits offsets points to a vector of ints to be filled in with offsets offsetcount the number of elements in the vector Returns: > 0 => success; value is the number of elements filled in = 0 => success, but offsets is not big enough -1 => failed to match < -1 => some kind of unexpected problem */ int pcre_exec (re, extra, subject, length, start_offset, options, offsets, offsetcount) const pcre *re; const pcre_extra *extra; const char *subject; int length; int start_offset; int options; int *offsets; int offsetcount; { int resetcount, ocount; int first_char = -1; int req_char = -1; int req_char2 = -1; unsigned long int ims = 0; match_data match_block; const uschar *start_bits = NULL; const uschar *bmtable = NULL; const uschar *start_match; const uschar *end_subject; const uschar *req_char_ptr = start_match - 1; BOOL using_temporary_offsets = FALSE; BOOL anchored; BOOL startline; if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; if (re == NULL || subject == NULL || (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; anchored = ((re->options | options) & PCRE_ANCHORED) != 0; startline = (re->options & PCRE_STARTLINE) != 0; match_block.start_pattern = re->code; match_block.start_subject = (const uschar *) subject; match_block.end_subject = match_block.start_subject + length; match_block.first_start = match_block.start_subject + start_offset; match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; match_block.notbol = (options & PCRE_NOTBOL) != 0; match_block.noteol = (options & PCRE_NOTEOL) != 0; match_block.notempty = (options & PCRE_NOTEMPTY) != 0; match_block.errorcode = PCRE_ERROR_NOMATCH; /* Default error */ match_block.lcc = re->tables + lcc_offset; match_block.ctypes = re->tables + ctypes_offset; start_match = match_block.first_start; end_subject = match_block.end_subject; /* For matches anchored to the end of the pattern, we can often avoid analyzing most of the pattern. length > re->max_match_size is implied in the second condition, because start_offset > 0. */ if (re->max_match_size >= 0 && length - re->max_match_size > start_offset) start_match = (const uschar *) subject + length - re->max_match_size; /* The ims options can vary during the matching as a result of the presence of (?ims) items in the pattern. They are kept in a local variable so that restoring at the exit of a group is easy. */ ims = re->options & (PCRE_CASELESS | PCRE_MULTILINE | PCRE_DOTALL); /* Set up the first character to match, if available. The first_char value is never set for an anchored regular expression, but the anchoring may be forced at run time, so we have to test for anchoring. The first char may be unset for an unanchored pattern, of course. If there's no first char and the pattern was studied, there may be a bitmap of possible first characters. */ if (!anchored) { if ((re->options & PCRE_FIRSTSET) != 0) { first_char = re->first_char; if ((ims & PCRE_CASELESS) != 0) first_char = match_block.lcc[first_char]; } if (!startline && extra != NULL) { if ((extra->options & PCRE_STUDY_MAPPED) != 0) start_bits = extra->data.start_bits; else if ((extra->options & PCRE_STUDY_BM) != 0) { bmtable = extra->data.bmtable; if (start_match + bmtable[256] > end_subject) return PCRE_ERROR_NOMATCH; } } } /* If the expression has got more back references than the offsets supplied can hold, we get a temporary bit of working store to use during the matching. Otherwise, we can use the vector supplied, rounding down its size to a multiple of 3. */ ocount = offsetcount - (offsetcount % 3); if (re->top_backref > 0 && re->top_backref >= ocount / 3) { ocount = re->top_backref * 3 + 3; match_block.offset_vector = (int *) (pcre_malloc) (ocount * sizeof (int)); if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY; using_temporary_offsets = TRUE; DPRINTF (("Got memory to hold back references\n")); } else match_block.offset_vector = offsets; match_block.offset_end = ocount; match_block.offset_max = (2 * ocount) / 3; match_block.offset_overflow = FALSE; /* Compute the minimum number of offsets that we need to reset each time. Doing this makes a huge difference to execution time when there aren't many brackets in the pattern. */ resetcount = 2 + re->top_bracket * 2; if (resetcount > offsetcount) resetcount = ocount; /* Reset the working variable associated with each extraction. These should never be used unless previously set, but they get saved and restored, and so we initialize them to avoid reading uninitialized locations. */ if (match_block.offset_vector != NULL) { int *iptr = match_block.offset_vector + ocount; int *iend = iptr - resetcount / 2 + 1; while (--iptr >= iend) *iptr = -1; } /* For anchored or unanchored matches, there may be a "last known required character" set. If the PCRE_CASELESS is set, implying that the match starts caselessly, or if there are any changes of this flag within the regex, set up both cases of the character. Otherwise set the two values the same, which will avoid duplicate testing (which takes significant time). This covers the vast majority of cases. It will be suboptimal when the case flag changes in a regex and the required character in fact is caseful. */ if ((re->options & PCRE_REQCHSET) != 0) { req_char = re->req_char; req_char2 = ((re->options & (PCRE_CASELESS | PCRE_ICHANGED)) != 0) ? (re->tables + fcc_offset)[req_char] : req_char; } /* Loop for handling unanchored repeated matching attempts; for anchored regexs the loop runs just once. */ do { int rc; int *iptr = match_block.offset_vector; int *iend = iptr + resetcount; #ifdef DEBUG int skipped_chars = 0; #endif /* Reset the maximum number of extractions we might see. */ while (iptr < iend) *iptr++ = -1; /* Advance to a possible match for an initial string after study */ if (bmtable != NULL) { #ifdef DEBUG skipped_chars += bmtable[256] - 1; #endif start_match += bmtable[256] - 1; while (start_match < end_subject) { if (bmtable[*start_match]) #ifdef DEBUG skipped_chars += bmtable[*start_match], #endif start_match += bmtable[*start_match]; else { #ifdef DEBUG skipped_chars -= bmtable[256] - 1; #endif start_match -= bmtable[256] - 1; break; } } } /* Or to a unique first char if possible */ else if (first_char >= 0) { if ((ims & PCRE_CASELESS) != 0) while (start_match < end_subject && match_block.lcc[*start_match] != first_char) #ifdef DEBUG skipped_chars++, #endif start_match++; else while (start_match < end_subject && *start_match != first_char) #ifdef DEBUG skipped_chars++, #endif start_match++; } /* Or to just after \n for a multiline match if possible */ else if (startline) { if (start_match > match_block.start_subject + start_offset) { while (start_match < end_subject && start_match[-1] != '\n') #ifdef DEBUG skipped_chars++, #endif start_match++; } } /* Or to a non-unique first char after study */ else if (start_bits != NULL) { while (start_match < end_subject) { int c = *start_match; if ((start_bits[c / 8] & (1 << (c & 7))) == 0) #ifdef DEBUG skipped_chars++, #endif start_match++; else break; } } #ifdef DEBUG if (skipped_chars) printf (">>>>> Skipped %d chars to reach first character\n", skipped_chars); printf (">>>> Match against: "); pchars (start_match, end_subject - start_match, TRUE, &match_block); printf ("\n"); #endif /* If req_char is set, we know that that character must appear in the subject for the match to succeed. If the first character is set, req_char must be later in the subject; otherwise the test starts at the match point. This optimization can save a huge amount of backtracking in patterns with nested unlimited repeats that aren't going to match. We don't know what the state of case matching may be when this character is hit, so test for it in both its cases if necessary. However, the different cased versions will not be set up unless PCRE_CASELESS was given or the casing state changes within the regex. Writing separate code makes it go faster, as does using an autoincrement and backing off on a match. */ if (req_char >= 0) { const uschar *p = start_match + ((first_char >= 0) ? 1 : 0); /* We don't need to repeat the search if we haven't yet reached the place we found it at last time. */ if (p > req_char_ptr) { /* Do a single test if no case difference is set up */ if (req_char == req_char2) { while (p < end_subject) { if (*p++ == req_char) { p--; break; } } } /* Otherwise test for either case */ else { while (p < end_subject) { int pp = *p++; if (pp == req_char || pp == req_char2) { p--; break; } } } /* If we can't find the required character, break the matching loop */ if (p >= end_subject) break; /* If we have found the required character, save the point where we found it, so that we don't search again next time round the loop if the start hasn't passed this character yet. */ req_char_ptr = p; } } /* When a match occurs, substrings will be set for all internal extractions; we just need to set up the whole thing as substring 0 before returning. If there were too many extractions, set the return code to zero. In the case where we had to get some local store to hold offsets for backreferences, copy those back references that we can. In this case there need not be overflow if certain parts of the pattern were not used. */ match_block.start_match = start_match; if (!match (start_match, re->code, 2, &match_block, ims, NULL, match_isgroup)) continue; /* Copy the offset information from temporary store if necessary */ if (using_temporary_offsets) { if (offsetcount >= 4) { memcpy (offsets + 2, match_block.offset_vector + 2, (offsetcount - 2) * sizeof (int)); DPRINTF (("Copied offsets from temporary memory\n")); } if (match_block.end_offset_top > offsetcount) match_block.offset_overflow = TRUE; DPRINTF (("Freeing temporary memory\n")); (pcre_free) (match_block.offset_vector); } rc = match_block.offset_overflow ? 0 : match_block.end_offset_top / 2; if (offsetcount < 2) rc = 0; else { offsets[0] = start_match - match_block.start_subject; offsets[1] = match_block.end_match_ptr - match_block.start_subject; } DPRINTF ((">>>> returning %d\n", rc)); return rc; } /* This "while" is the end of the "do" above */ while (!anchored && match_block.errorcode == PCRE_ERROR_NOMATCH && start_match++ < end_subject); if (using_temporary_offsets) { DPRINTF (("Freeing temporary memory\n")); (pcre_free) (match_block.offset_vector); } DPRINTF ((">>>> returning %d\n", match_block.errorcode)); return match_block.errorcode; } sed-3.62/pcre/regexp.c0000644000076600007660000002514210143133571011545 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. This module is a wrapper that provides a POSIX API to the underlying PCRE functions. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ #include "internal.h" #include "regexp.h" #include "stdlib.h" /* Corresponding tables of PCRE error messages and POSIX error codes. */ const char *pcre_estrings[] = { "", N_("\\ at end of pattern"), N_("\\c at end of pattern"), N_("unrecognized character follows \\"), N_("numbers out of order in {} quantifier"), N_("number too big in {} quantifier"), N_("missing terminating ] for character class"), N_("invalid escape sequence in character class"), N_("range out of order in character class"), N_("nothing to repeat"), N_("operand of unlimited repeat could match the empty string"), N_("internal error: unexpected repeat"), N_("unrecognized character after (?"), N_("unused error"), N_("unmatched braces"), N_("back reference to non-existent subpattern"), N_("erroffset passed as NULL"), N_("unknown option bit(s) set"), N_("missing ) after comment"), N_("parentheses nested too deeply"), N_("regular expression too large"), N_("failed to get memory"), N_("unmatched parentheses"), N_("internal error: code overflow"), N_("unrecognized character after (?<"), N_("lookbehind assertion is not fixed length"), N_("malformed number after (?("), N_("conditional group contains more than two branches"), N_("assertion expected after (?("), N_("(?p must be followed by )"), N_("unknown POSIX class name"), N_("POSIX collating elements are not supported"), N_("bad condition (?(0)") }; static int eint[] = { 0, REG_EESCAPE, /* \\ at end of pattern */ REG_EESCAPE, /* \\c at end of pattern */ REG_EESCAPE, /* unrecognized character follows \\ */ REG_BADBR, /* numbers out of order in {} quantifier */ REG_BADBR, /* number too big in {} quantifier */ REG_EBRACK, /* missing terminating ] for character class */ REG_ECTYPE, /* invalid escape sequence in character class */ REG_ERANGE, /* range out of order in character class */ REG_BADRPT, /* nothing to repeat */ REG_BADRPT, /* operand of unlimited repeat could match the empty string */ REG_ASSERT, /* internal error: unexpected repeat */ REG_BADPAT, /* unrecognized character after (? */ REG_ASSERT, /* unused error */ REG_EPAREN, /* missing ) */ REG_ESUBREG, /* back reference to non-existent subpattern */ REG_INVARG, /* erroffset passed as NULL */ REG_INVARG, /* unknown option bit(s) set */ REG_EPAREN, /* missing ) after comment */ REG_ESIZE, /* parentheses nested too deeply */ REG_ESIZE, /* regular expression too large */ REG_ESPACE, /* failed to get memory */ REG_EPAREN, /* unmatched brackets */ REG_ASSERT, /* internal error: code overflow */ REG_BADPAT, /* unrecognized character after (?< */ REG_BADPAT, /* lookbehind assertion is not fixed length */ REG_BADPAT, /* malformed number after (?( */ REG_BADPAT, /* conditional group containe more than two branches */ REG_BADPAT, /* assertion expected after (?( */ REG_BADPAT, /* (?p must be followed by ) */ REG_ECTYPE, /* unknown POSIX class name */ REG_BADPAT, /* POSIX collating elements are not supported */ REG_BADPAT, /* character value in \x{...} sequence is too large */ REG_BADPAT /* invalid condition (?(0) */ }; /* Table of texts corresponding to POSIX error codes */ static const char *pstring[] = { "", N_("internal error"), N_("invalid repeat counts in {}"), N_("pattern error"), N_("nothing to repeat"), N_("unmatched braces"), N_("missing terminating ] for character class"), N_("bad collating element"), N_("unknown POSIX class name"), N_("bad escape sequence"), N_("empty expression"), N_("unmatched parentheses"), N_("range out of order in character class"), N_("regular expression too large"), N_("failed to get memory"), N_("back reference to non-existent subpattern"), N_("bad argument"), N_("match failed") }; /************************************************* * Translate PCRE text code to int * *************************************************/ /* PCRE compile-time errors are given as strings defined as macros. We can just look them up in a table to turn them into POSIX-style error codes. */ static int pcre_posix_error_code (s) const char *s; { size_t i; for (i = 1; i < sizeof (pcre_estrings) / sizeof (char *); i++) if (strcmp (s, pcre_estrings[i]) == 0) return eint[i]; return REG_ASSERT; } /************************************************* * Translate error code to string * *************************************************/ size_t regerror (errcode, preg, errbuf, errbuf_size) int errcode; const regex_t *preg; char *errbuf; size_t errbuf_size; { const char *message, *addmessage; size_t size; message = (errcode >= (int) (sizeof (pstring) / sizeof (char *))) ? _("unknown error code") : gettext(pstring[errcode]); addmessage = _("%s at offset %-6d"); if (errbuf_size > 0) { if (preg != NULL && (int) preg->re_erroffset != -1) size = snprintf (errbuf, errbuf_size - 1, addmessage, message, (int) preg->re_erroffset); else strncpy (errbuf, message, errbuf_size - 1); } errbuf[errbuf_size - 1] = 0; return strlen(errbuf); } /************************************************* * Free store held by a regex * *************************************************/ void regfree (preg) regex_t *preg; { (pcre_free) (preg->re_pcre); } /************************************************* * Compile a regular expression * *************************************************/ /* Arguments: preg points to a structure for recording the compiled expression pattern the pattern to compile cflags compilation flags Returns: 0 on success various non-zero codes on failure */ int regcomp (preg, pattern, cflags) regex_t *preg; const char *pattern; int cflags; { return regncomp (preg, pattern, (int) strlen (pattern), cflags); } int regncomp (preg, pattern, length, cflags) regex_t *preg; const char *pattern; int length, cflags; { const char *errptr; int errofs; int options = PCRE_ENGLISH_ERRORS; options |= (cflags & REG_ICASE) ? PCRE_CASELESS : 0; options |= (cflags & REG_EXTENDED) ? PCRE_EXTENDED : 0; if ((cflags & REG_PERL) != 0) { options |= (cflags & REG_NEWLINE) ? PCRE_MULTILINE : 0; options |= (cflags & REG_DOTALL) ? PCRE_DOTALL : 0; preg->re_pcre = pcre_compile_nuls (pattern, length, options, &errptr, &errofs, NULL); } else { options |= (cflags & REG_NEWLINE) ? PCRE_MULTILINE : PCRE_DOTALL; preg->re_pcre = pcre_posix_compile_nuls (pattern, length, options, &errptr, &errofs, NULL); } preg->re_erroffset = errofs; if (preg->re_pcre == NULL) return pcre_posix_error_code (errptr); preg->re_study = pcre_study (preg->re_pcre, 0, &errptr); pcre_info (preg->re_pcre, preg->re_study, PCRE_INFO_CAPTURECOUNT, &preg->re_nsub); return 0; } /************************************************* * Match a regular expression * *************************************************/ int regexec (preg, string, nmatch, pmatch, eflags) regex_t *preg; const char *string; size_t nmatch; regmatch_t pmatch[]; int eflags; { if (eflags & REG_STARTEND) return regnexec (preg, string, 0, nmatch, pmatch, eflags); else return regnexec (preg, string, (int) strlen (string), nmatch, pmatch, eflags); } int regnexec (preg, string, length, nmatch, pmatch, eflags) regex_t *preg; const char *string; int length; size_t nmatch; regmatch_t pmatch[]; int eflags; { int start; int rc; int options; int *ovector = NULL; if (eflags & REG_STARTEND) { start = pmatch[0].rm_so; length = pmatch[0].rm_eo; } else start = 0; options = ((eflags & REG_NOTBOL) ? PCRE_NOTBOL : 0) | ((eflags & REG_NOTEOL) ? PCRE_NOTEOL : 0); preg->re_erroffset = (size_t) (-1); /* Only has meaning after compile */ /* Unfortunately, PCRE requires 3 ints of working space for each captured substring, so we have to get and release working store instead of just using the POSIX structures as was done in earlier releases when PCRE needed only 2 ints. */ ovector = (int *) (pcre_malloc) (sizeof (int) * (preg->re_nsub * 3 + 3)); if (ovector == NULL) return REG_ESPACE; rc = pcre_exec (preg->re_pcre, preg->re_study, string, length, start, options, ovector, preg->re_nsub * 3 + 3); if (rc > 0) { size_t i, max; max = rc < nmatch ? rc : nmatch; for (i = 0; i < max; i++) { pmatch[i].rm_so = ovector[i * 2]; pmatch[i].rm_eo = ovector[i * 2 + 1]; } for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1; (pcre_free) (ovector); return 0; } else { (pcre_free) (ovector); switch (rc) { case PCRE_ERROR_NOMATCH: return REG_NOMATCH; case PCRE_ERROR_NULL: return REG_INVARG; case PCRE_ERROR_BADOPTION: return REG_INVARG; case PCRE_ERROR_BADMAGIC: return REG_INVARG; case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT; case PCRE_ERROR_NOMEMORY: return REG_ESPACE; default: return REG_ASSERT; } } } sed-3.62/pcre/regexp.h0000644000076600007660000000522710143133571011554 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* Copyright (c) 1997-2000 University of Cambridge */ #ifndef _PCREPOSIX_H #define _PCREPOSIX_H /* This is the header for the POSIX wrapper interface to the PCRE Perl- Compatible Regular Expression library. It defines the things POSIX says should be there. I hope. */ /* Have to include stdlib.h in order to ensure that size_t is defined. */ #include /* Allow for C++ users */ #ifdef __cplusplus extern "C" { #endif #ifdef __STDC__ #define __PCRE_PROTO(a) a #else #define __PCRE_PROTO(a) () #endif /* Options defined by POSIX. */ #define REG_ICASE 0x01 #define REG_NEWLINE 0x02 #define REG_NOTBOL 0x04 #define REG_NOTEOL 0x08 #define REG_EXTENDED 0x10 #define REG_PERL 0x20 #define REG_DOTALL 0x40 #define REG_STARTEND 0x80 /* These are not used by PCRE, but by defining them we make it easier to slot PCRE into existing programs that make POSIX calls. */ #define REG_NOSUB 0 /* Error values. Not all these are relevant or used by the wrapper. */ enum { REG_ASSERT = 1, /* internal error ? */ REG_BADBR, /* invalid repeat counts in {} */ REG_BADPAT, /* pattern error */ REG_BADRPT, /* ? * + invalid */ REG_EBRACE, /* unbalanced {} */ REG_EBRACK, /* unbalanced [] */ REG_ECOLLATE, /* collation error - not relevant */ REG_ECTYPE, /* bad class */ REG_EESCAPE, /* bad escape sequence */ REG_EMPTY, /* empty expression */ REG_EPAREN, /* unbalanced () */ REG_ERANGE, /* bad range inside [] */ REG_ESIZE, /* expression too big */ REG_ESPACE, /* failed to get memory */ REG_ESUBREG, /* bad back reference */ REG_INVARG, /* bad argument */ REG_NOMATCH /* match failed */ }; /* The structure representing a compiled regular expression. */ typedef struct { void *re_pcre; void *re_study; size_t re_nsub; size_t re_erroffset; } regex_t; /* The structure in which a captured offset is returned. */ typedef int regoff_t; typedef struct { regoff_t rm_so; regoff_t rm_eo; } regmatch_t; /* The functions */ extern int regcomp __PCRE_PROTO ((regex_t *, const char *, int)); extern int regncomp __PCRE_PROTO ((regex_t *, const char *, int, int)); extern int regexec __PCRE_PROTO ((regex_t *, const char *, size_t, regmatch_t *, int)); extern int regnexec __PCRE_PROTO ((regex_t *, const char *, int, size_t, regmatch_t *, int)); extern size_t regerror __PCRE_PROTO ((int, const regex_t *, char *, size_t)); extern void regfree __PCRE_PROTO ((regex_t *)); #ifdef __cplusplus } /* extern "C" */ #endif #undef __PCRE_PROTO #endif sed-3.62/pcre/reginfo.c0000644000076600007660000000646610143133571011714 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ #include "internal.h" /************************************************* * Return info about compiled pattern * *************************************************/ /* This is a newer "info" function which has an extensible interface so that additional items can be added compatibly. Arguments: external_re points to compiled code external_study points to study data, or NULL what what information is required where where to put the information Returns: 0 if data returned, negative on error */ int pcre_info (re, study, what, where) const pcre *re; const pcre_extra *study; int what; void *where; { if (re == NULL || where == NULL) return PCRE_ERROR_NULL; if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; switch (what) { case PCRE_INFO_OPTIONS: *((unsigned long int *) where) = re->options & PUBLIC_OPTIONS; break; case PCRE_INFO_SIZE: *((size_t *) where) = re->size; break; case PCRE_INFO_CAPTURECOUNT: *((int *) where) = re->top_bracket; break; case PCRE_INFO_BACKREFMAX: *((int *) where) = re->top_backref; break; case PCRE_INFO_FIRSTCHAR: *((int *) where) = ((re->options & PCRE_FIRSTSET) != 0) ? re->first_char : ((re->options & PCRE_STARTLINE) != 0) ? -1 : -2; break; case PCRE_INFO_BMTABLE: *((const uschar **) where) = (study != NULL && (study->options & PCRE_STUDY_BM) != 0) ? study->data.bmtable : NULL; break; case PCRE_INFO_FIRSTTABLE: *((const uschar **) where) = (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0) ? study->data.start_bits : NULL; break; case PCRE_INFO_LASTLITERAL: *((int *) where) = ((re->options & PCRE_REQCHSET) != 0) ? re->req_char : -1; break; default: return PCRE_ERROR_BADOPTION; } return 0; } sed-3.62/pcre/regperl.c0000644000076600007660000017241510143133571011721 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* Include the internals header, which itself includes Standard C headers plus the external pcre header. */ #include "internal.h" /* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef inline, and there are *still* stupid compilers about that don't like indented pre-processor statements. I suppose it's only been 10 years... */ #ifdef DEBUG #define DPRINTF(p) printf p #define DFWRITE(p) fwrite p #else #define DPRINTF(p) /*nothing */ #define DFWRITE(p) /*nothing */ #endif /* Allow compilation as C++ source code, should anybody want to do that. */ #ifdef __cplusplus #define class pcre_class #endif /* Maximum number of items on the nested bracket stacks at compile time. This applies to the nesting of all kinds of parentheses. It does not limit un-nested, non-capturing parentheses. This number can be made bigger if necessary - it is used to dimension one int and one unsigned char vector at compile time. */ #define BRASTACK_SIZE 200 /* The number of bytes in a literal character string above which we can't add any more. */ #define MAXLIT 255 /* Table for handling escaped characters in the range '0'-'z'. Positive returns are simple data values; negative values are for special things like \d and so on. Zero means further processing is needed (for things like \x), or the escape is invalid. */ static const short int escapes[] = { 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */ 0, 0, ':', ';', '<', '=', '>', '?', /* 8 - ? */ '@', -ESC_A, -ESC_B, 0, -ESC_D, 0, 0, -ESC_G, /* @ - G */ 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ 0, 0, 0, -ESC_S, 0, 0, 0, -ESC_W, /* P - W */ 0, 0, -ESC_Z, '[', '\\', ']', '^', '_', /* X - _ */ '`', 7, -ESC_b, 0, -ESC_d, 27, '\f', 0, /* ` - g */ 0, 0, 0, 0, 0, 0, '\n', 0, /* h - o */ 0, 0, '\r', -ESC_s, '\t', 0, 0, -ESC_w, /* p - w */ 0, 0, -ESC_z /* x - z */ }; /************************************************* * Global variables * *************************************************/ /* PCRE is thread-clean and doesn't use any global variables in the normal sense. However, it calls memory allocation and free functions via the two indirections below, which are can be changed by the caller, but are shared between all threads. */ void *(*pcre_malloc) (size_t) = malloc; void (*pcre_free) (void *) = free; #include "regcomp.c" /************************************************* * Handle escapes * *************************************************/ /* This function is called when a \ has been encountered. It either returns a positive value for a simple escape such as \n, or a negative value which encodes one of the more complicated things such as \d. On entry, ptr is pointing at the \. On exit, it is on the final character of the escape sequence. Arguments: ptrptr points to the pattern position pointer errorptr points to the pointer to the error message bracount number of previous capturing brackets options the options bits isclass TRUE if inside a character class cd pointer to char tables block Returns: zero or positive => a data character negative => a special escape sequence on error, errorptr is set */ static int check_escape (ptrptr, errorptr, bracount, options, isclass, cd) const uschar **ptrptr; const char **errorptr; int bracount; int options; BOOL isclass; compile_data *cd; { const uschar *ptr = *ptrptr; int c, i; c = *(++ptr); /* Digits or letters may have special meaning; all others are literals. */ if (c < '0' || c > 'z') { } /* Do an initial lookup in a table. A non-zero result is something that can be returned immediately. Otherwise further processing may be required. */ else if ((i = escapes[c - '0']) != 0) c = i; /* Escapes that need further processing, or are illegal. */ else { const uschar *oldptr; switch (c) { /* The handling of escape sequences consisting of a string of digits starting with one that is not zero is not straightforward. By experiment, the way Perl works seems to be as follows: Outside a character class, the digits are read as a decimal number. If the number is less than 10, or if there are that many previous capturing left brackets, then it is a back reference. Otherwise, up to three octal digits are read to form an escaped byte. Thus \123 is likely to be octal 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal value is greater than 377, the least significant 8 bits are taken. Inside a character class, \ followed by a digit is always an octal number. */ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (!isclass) { oldptr = ptr; c -= '0'; while (ptr < cd->end && (cd->ctypes[ptr[1]] & ctype_digit) != 0) c = c * 10 + *(++ptr) - '0'; if (c < 10 || c <= bracount) { c = -(ESC_REF + c); break; } ptr = oldptr; /* Put the pointer back and fall through */ } /* Handle an octal number following \. If the first digit is 8 or 9, Perl generates a binary zero byte and treats the digit as a following literal. Thus we have to pull back the pointer by one. */ if ((c = *ptr) >= '8') { ptr--; c = 0; break; } /* \0 always starts an octal number, but we may drop through to here with a larger first octal digit. */ case '0': c -= '0'; while (i++ < 2 && ptr < cd->end && (cd->ctypes[ptr[1]] & ctype_digit) != 0 && ptr[1] != '8' && ptr[1] != '9') c = c * 8 + *(++ptr) - '0'; c &= 255; /* Take least significant 8 bits */ break; case 'x': /* Read just a single hex char */ c = 0; while (i++ < 2 && ptr < cd->end && (cd->ctypes[ptr[1]] & ctype_xdigit) != 0) { ptr++; c = c * 16 + cd->lcc[*ptr] - (((cd->ctypes[*ptr] & ctype_digit) != 0) ? '0' : 'W'); } break; /* Other special escapes not starting with a digit are straightforward */ case 'c': if ((++ptr) > cd->end || (c = *ptr) == 0) { *errorptr = pcre_estrings[2]; return 0; } /* A letter is upper-cased; then the 0x40 bit is flipped */ if (c >= 'a' && c <= 'z') c = cd->fcc[c]; c ^= 0x40; break; /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any other alphameric following \ is an error if PCRE_EXTRA was set; otherwise, for Perl compatibility, it is a literal. This code looks a bit odd, but there used to be some cases other than the default, and there may be again in future, so I haven't "optimized" it. */ default: if ((options & PCRE_EXTRA) != 0) switch (c) { default: *errorptr = pcre_estrings[3]; break; } break; } } *ptrptr = ptr; return c; } /************************************************* * Compile one branch * *************************************************/ /* Scan the pattern, compiling it into the code vector. Arguments: options the option bits brackets points to number of capturing brackets used code points to the pointer to the current code point ptrptr points to the current pattern pointer errorptr points to pointer to error message optchanged set to the value of the last OP_OPT item compiled reqchar set to the last literal character required, else -1 countlits set to count of mandatory literal characters cd contains pointers to tables Returns: TRUE on success FALSE, with *errorptr set on error */ static BOOL compile_branch_perl (options, brackets, codeptr, ptrptr, errorptr, optchanged, reqchar, countlits, cd) int options; int *brackets; uschar **codeptr; const uschar **ptrptr; const char **errorptr; int *optchanged; int *reqchar; int *countlits; compile_data *cd; { int repeat_type, op_type; int repeat_min, repeat_max; int bravalue, length; int greedy_default, greedy_non_default; int prevreqchar; int condcount = 0; int subcountlits = 0; int c; uschar *start; uschar *code = *codeptr; const uschar *ptr = *ptrptr; const uschar *tempptr; uschar *previous = NULL; uschar class[32]; /* Set up the default and non-default settings for greediness */ greedy_default = ((options & PCRE_UNGREEDY) != 0); greedy_non_default = greedy_default ^ 1; /* Initialize no required char, and count of literals */ *reqchar = prevreqchar = -1; *countlits = 0; /* Switch on next character until the end of the branch */ for (; ptr <= cd->end; ptr++) { BOOL negate_class; int class_charcount; int class_lastchar; int newoptions; int skipbytes; int subreqchar; c = *ptr; if ((options & PCRE_EXTENDED) != 0) { if ((cd->ctypes[c] & ctype_space) != 0) continue; if (c == '#') { /* The space before the ; is to avoid a warning on a silly compiler on the Macintosh. */ while (ptr < cd->end && (c = *(++ptr)) != 0 && c != '\n'); continue; } } switch (c) { /* The branch terminates at end of string, |, or ). */ case '|': case ')': goto SUCCEEDED; /* Handle single-character metacharacters */ case '^': previous = NULL; *code++ = OP_CIRC; break; case '$': previous = NULL; *code++ = OP_DOLL; break; case '.': previous = code; *code++ = OP_ANY; break; /* Character classes. These always build a 32-byte bitmap of the permitted characters, except in the special case where there is only one character. For negated classes, we build the map as usual, then invert it at the end. */ case '[': previous = code; *code++ = OP_CLASS; /* If the first character is '^', set the negation flag and skip it. */ if ((c = *(++ptr)) == '^') { negate_class = TRUE; c = *(++ptr); } else negate_class = FALSE; /* Keep a count of chars so that we can optimize the case of just a single character. */ class_charcount = 0; class_lastchar = -1; /* Initialize the 32-char bit map to all zeros. We have to build the map in a temporary bit of store, in case the class contains only 1 character, because in that case the compiled code doesn't use the bit map. */ memset (class, 0, 32 * sizeof (uschar)); /* Process characters until ] is reached. By writing this as a "do" it means that an initial ] is taken as a data character. We also have to take care of this in the `if' below: it is an error if we reach the last character and we have not added a data character yet, because a closing bracket will not be considered as a terminator. */ do { if (ptr > cd->end || (ptr == cd->end && *ptr != ']') || (ptr == cd->end && class_charcount == 0)) { *errorptr = pcre_estrings[6]; goto FAILED; } /* Handle POSIX class names. Perl allows a negation extension of the form [:^name]. A square bracket that doesn't match the syntax is treated as a literal. We also recognize the POSIX constructions [.ch.] and [=ch=] ("collating elements") and fault them, as Perl 5.6 does. */ if (c == '[' && (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && check_posix_syntax (ptr, &tempptr, cd)) { BOOL local_negate = FALSE; int posix_class, i; const uschar *cbits = cd->cbits; if (ptr[1] != ':') { *errorptr = pcre_estrings[31]; goto FAILED; } ptr += 2; if (*ptr == '^') { local_negate = TRUE; ptr++; } posix_class = check_posix_name (ptr, tempptr - ptr); if (posix_class < 0) { *errorptr = pcre_estrings[30]; goto FAILED; } /* If matching is caseless, upper and lower are converted to alpha. This relies on the fact that the class table starts with alpha, lower, upper as the first 3 entries. */ if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) posix_class = 0; /* Or into the map we are building up to 3 of the static class tables, or their negations. */ posix_class *= 3; for (i = 0; i < 3; i++) { int taboffset = posix_class_maps[posix_class + i]; if (taboffset < 0) break; if (local_negate) for (c = 0; c < 32; c++) class[c] |= ~cbits[c + taboffset]; else for (c = 0; c < 32; c++) class[c] |= cbits[c + taboffset]; } ptr = tempptr + 1; class_charcount = 10; /* Set > 1; assumes more than 1 per class */ continue; } /* Backslash may introduce a single character, or it may introduce one of the specials, which just set a flag. Escaped items are checked for validity in the pre-compiling pass. The sequence \b is a special case. Inside a class (and only there) it is treated as backspace. Elsewhere it marks a word boundary. Other escapes have preset maps ready to or into the one we are building. We assume they have more than one character in them, so set class_count bigger than one. */ if (c == '\\') { c = check_escape (&ptr, errorptr, *brackets, options, TRUE, cd); if (-c == ESC_b) c = '\b'; else if (c < 0) { const uschar *cbits = cd->cbits; class_charcount = 10; switch (-c) { case ESC_d: for (c = 0; c < 32; c++) class[c] |= cbits[c + cbit_digit]; continue; case ESC_D: for (c = 0; c < 32; c++) class[c] |= ~cbits[c + cbit_digit]; continue; case ESC_w: for (c = 0; c < 32; c++) class[c] |= cbits[c + cbit_word]; continue; case ESC_W: for (c = 0; c < 32; c++) class[c] |= ~cbits[c + cbit_word]; continue; case ESC_s: for (c = 0; c < 32; c++) class[c] |= cbits[c + cbit_space]; continue; case ESC_S: for (c = 0; c < 32; c++) class[c] |= ~cbits[c + cbit_space]; continue; default: *errorptr = pcre_estrings[7]; goto FAILED; } } } /* A single character may be followed by '-' to form a range. However, Perl and Posix do not permit ']' to be the end of the range. An hyphen here is treated as a literal. */ if (ptr[1] == '-' && ptr[2] != ']') { int d; ptr += 2; if (ptr > cd->end) { *errorptr = pcre_estrings[6]; goto FAILED; } d = *ptr; /* The second part of a range can be a single-character escape, but not any of the other escapes. Perl 5.6 treats a hyphen as a literal in such circumstances. */ if (d == '\\') { const uschar *oldptr = ptr; d = check_escape (&ptr, errorptr, *brackets, options, TRUE, cd); /* \b is backslash; any other special means the '-' was literal */ if (d < 0) { if (d == -ESC_b) d = '\b'; else { ptr = oldptr - 2; goto SINGLE_CHARACTER; /* A few lines below */ } } } if (d < c) { *errorptr = pcre_estrings[8]; goto FAILED; } for (; c <= d; c++) { class[c / 8] |= (1 << (c & 7)); if ((options & PCRE_CASELESS) != 0) { int uc = cd->fcc[c]; /* flip case */ class[uc / 8] |= (1 << (uc & 7)); } class_charcount++; /* in case a one-char range */ class_lastchar = c; } continue; /* Go get the next char in the class */ } /* Handle a lone single character - we can get here for a normal non-escape char, or after \ that introduces a single character. */ SINGLE_CHARACTER: class[c / 8] |= (1 << (c & 7)); if ((options & PCRE_CASELESS) != 0) { c = cd->fcc[c]; /* flip case */ class[c / 8] |= (1 << (c & 7)); } class_charcount++; class_lastchar = c; } /* Loop until ']' reached; the check for end of string happens inside the loop. This "while" is the end of the "do" above. */ while ((c = *(++ptr)) != ']'); /* If class_charcount is 1 and class_lastchar is not negative, we saw precisely one character. This doesn't need the whole 32-byte bit map. We turn it into a 1-character OP_CHAR if it's positive, or OP_NOT if it's negative. */ if (class_charcount == 1 && class_lastchar >= 0) { if (negate_class) { code[-1] = OP_NOT; } else { code[-1] = OP_CHARS; *code++ = 1; } *code++ = class_lastchar; } /* Otherwise, negate the 32-byte map if necessary, and copy it into the code vector. */ else { if (negate_class) for (c = 0; c < 32; c++) code[c] = ~class[c]; else memcpy (code, class, 32); code += 32; } break; /* Various kinds of repeat */ case '{': if (!is_counted_repeat (ptr + 1, cd)) goto NORMAL_CHAR; repeat_min = repeat_max = 1; ptr = read_repeat_counts (ptr + 1, &repeat_min, &repeat_max, errorptr, cd); if (*errorptr != NULL) goto FAILED; goto REPEAT; case '*': repeat_min = 0; repeat_max = -1; goto REPEAT; case '+': repeat_min = 1; repeat_max = -1; goto REPEAT; case '?': repeat_min = 0; repeat_max = 1; REPEAT: if (previous == NULL) { *errorptr = pcre_estrings[9]; goto FAILED; } /* If the next character is '?' this is a minimizing repeat, by default, but if PCRE_UNGREEDY is set, it works the other way round. Advance to the next character. */ if (ptr < cd->end && ptr[1] == '?') { repeat_type = greedy_non_default; ptr++; } else repeat_type = greedy_default; /* If previous was a string of characters, chop off the last one and use it as the subject of the repeat. If there was only one character, we can abolish the previous item altogether. A repeat with a zero minimum wipes out any reqchar setting, backing up to the previous value. We must also adjust the countlits value. */ if (*previous == OP_CHARS) { int len = previous[1]; if (repeat_min == 0) *reqchar = prevreqchar; *countlits += repeat_min - 1; if (len == 1) { c = previous[2]; code = previous; } else { c = previous[len + 1]; previous[1]--; code--; } op_type = 0; /* Use single-char op codes */ goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */ } /* If previous was a single negated character ([^a] or similar), we use one of the special opcodes, replacing it. The code is shared with single- character repeats by adding a suitable offset into repeat_type. */ else if ((int) *previous == OP_NOT) { op_type = OP_NOT_MAXSTAR - OP_MAXSTAR; /* Use "not" opcodes */ c = previous[1]; code = previous; goto OUTPUT_SINGLE_REPEAT; } /* If previous was a character type match (\d or similar), abolish it and create a suitable repeat item. The code is shared with single-character repeats by adding a suitable offset into repeat_type. */ else if (*previous == OP_TYPE || *previous == OP_TYPENOT || *previous == OP_ANY) { if (*previous == OP_ANY) { c = 0; *previous = OP_TYPENOT; } else c = previous[1]; op_type = *previous - OP_CHARS; code = previous; OUTPUT_SINGLE_REPEAT: /* If the maximum is zero then the minimum must also be zero; Perl allows this case, so we do too - by simply omitting the item altogether. */ if (repeat_max == 0) goto END_REPEAT; /* Combine the op_type with the repeat_type */ repeat_type += op_type; /* A minimum of zero is handled either as the special case * or ?, or as an UPTO, with the maximum given. */ if (repeat_min == 0) { if (repeat_max == -1) *code++ = OP_MAXSTAR + repeat_type; else if (repeat_max == 1) *code++ = OP_MAXQUERY + repeat_type; else { *code++ = OP_MAXUPTO + repeat_type; *code++ = repeat_max >> 8; *code++ = (repeat_max & 255); } } /* The case {1,} is handled as the special case + */ else if (repeat_min == 1 && repeat_max == -1) *code++ = OP_MAXPLUS + repeat_type; /* The case {n,n} is just an EXACT, while the general case {n,m} is handled as an EXACT followed by an UPTO. An EXACT of 1 is optimized. */ else { if (repeat_min != 1) { *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */ *code++ = repeat_min >> 8; *code++ = (repeat_min & 255); } /* If the mininum is 1 and the previous item was a character string, we either have to put back the item that got cancelled if the string length was 1, or add the character back onto the end of a longer string. For a character type nothing need be done; it will just get put back naturally. Note that the final character is always going to get added below. */ else if (*previous == OP_CHARS) { if (code == previous) code += 2; else previous[1]++; } /* For a negated character or class we also have to put back the item that got cancelled. */ else if (*previous == OP_NOT || *previous == OP_TYPE || *previous == OP_TYPENOT) code++; /* If the maximum is unlimited, insert an OP_MAXSTAR. */ if (repeat_max < 0) { *code++ = c; *code++ = OP_MAXSTAR + repeat_type; } /* Else insert an UPTO if the max is greater than the min. */ else if (repeat_max != repeat_min) { *code++ = c; repeat_max -= repeat_min; *code++ = OP_MAXUPTO + repeat_type; *code++ = repeat_max >> 8; *code++ = (repeat_max & 255); } } /* The character or character type itself comes last in all cases. */ *code++ = c; } /* If previous was a character class or a back reference, we put the repeat stuff after it, but just skip the item if the repeat was {0,0}. */ else if (*previous == OP_CLASS || *previous == OP_REF) { if (repeat_max == 0) { code = previous; goto END_REPEAT; } if (*previous == OP_REF) repeat_type += OP_REF - OP_CLASS; if (repeat_min == 0 && repeat_max == -1) *previous = OP_CL_MAXSTAR + repeat_type; else if (repeat_min == 1 && repeat_max == -1) *previous = OP_CL_MAXPLUS + repeat_type; else if (repeat_min == 0 && repeat_max == 1) *previous = OP_CL_MAXQUERY + repeat_type; else { *previous = OP_CL_MAXRANGE + repeat_type; *code++ = repeat_min >> 8; *code++ = repeat_min & 255; if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */ *code++ = repeat_max >> 8; *code++ = repeat_max & 255; } } /* If previous was a bracket group, we may have to replicate it in certain cases. */ else if ((int) *previous >= OP_BRA || (int) *previous == OP_ONCE || (int) *previous == OP_COND) { int i; int ketoffset = 0; int len = code - previous; uschar *bralink = NULL; /* If the maximum repeat count is unlimited, find the end of the bracket by scanning through from the start, and compute the offset back to it from the current code pointer. There may be an OP_OPT setting following the final KET, so we can't find the end just by going back from the code pointer. */ if (repeat_max == -1) { uschar *ket = previous; do ket += (ket[1] << 8) + ket[2]; while (*ket != OP_KET); ketoffset = code - ket; } /* The case of a zero minimum is special because of the need to stick OP_BRAZERO in front of it, and because the group appears once in the data, whereas in other cases it appears the minimum number of times. For this reason, it is simplest to treat this case separately, as otherwise the code gets far too messy. There are several special subcases when the minimum is zero. */ if (repeat_min == 0) { /* If we set up a required char from the bracket, we must back off to the previous value and reset the countlits value too. */ if (subcountlits > 0) { *reqchar = prevreqchar; *countlits -= subcountlits; } /* If the maximum is also zero, we just omit the group from the output altogether. */ if (repeat_max == 0) { code = previous; goto END_REPEAT; } /* If the maximum is 1 or unlimited, we just have to stick in the BRAZERO and do no more at this point. */ if (repeat_max <= 1) { memmove (previous + 1, previous, len); code++; *previous++ = OP_BRAZERO + repeat_type; } /* If the maximum is greater than 1 and limited, we have to replicate in a nested fashion, sticking OP_BRAZERO before each set of brackets. The first one has to be handled carefully because it's the original copy, which has to be moved up. The remainder can be handled by code that is common with the non-zero minimum case below. We just have to adjust the value or repeat_max, since one less copy is required. */ else { int offset; memmove (previous + 4, previous, len); code += 4; *previous++ = OP_BRAZERO + repeat_type; *previous++ = OP_BRA; /* We chain together the bracket offset fields that have to be filled in later when the ends of the brackets are reached. */ offset = (bralink == NULL) ? 0 : previous - bralink; bralink = previous; *previous++ = offset >> 8; *previous++ = offset & 255; } repeat_max--; } /* If the minimum is greater than zero, replicate the group as many times as necessary, and adjust the maximum to the number of subsequent copies that we need. */ else { for (i = 1; i < repeat_min; i++) { memcpy (code, previous, len); code += len; } if (repeat_max > 0) repeat_max -= repeat_min; } /* This code is common to both the zero and non-zero minimum cases. If the maximum is limited, it replicates the group in a nested fashion, remembering the bracket starts on a stack. In the case of a zero minimum, the first one was set up above. In all cases the repeat_max now specifies the number of additional copies needed. */ if (repeat_max >= 0) { for (i = repeat_max - 1; i >= 0; i--) { *code++ = OP_BRAZERO + repeat_type; /* All but the final copy start a new nesting, maintaining the chain of brackets outstanding. */ if (i != 0) { int offset; *code++ = OP_BRA; offset = (bralink == NULL) ? 0 : code - bralink; bralink = code; *code++ = offset >> 8; *code++ = offset & 255; } memcpy (code, previous, len); code += len; } /* Now chain through the pending brackets, and fill in their length fields (which are holding the chain links pro tem). */ while (bralink != NULL) { int oldlinkoffset; int offset = code - bralink + 1; uschar *bra = code - offset; oldlinkoffset = (bra[1] << 8) + bra[2]; bralink = (oldlinkoffset == 0) ? NULL : bralink - oldlinkoffset; *code++ = OP_KET; *code++ = bra[1] = offset >> 8; *code++ = bra[2] = (offset & 255); } } /* If the maximum is unlimited, set a repeater in the final copy. We can't just offset backwards from the current code point, because we don't know if there's been an options resetting after the ket. The correct offset was computed above. */ else code[-ketoffset] = OP_KET_MAXSTAR + repeat_type; } /* Else there's some kind of shambles */ else { *errorptr = pcre_estrings[11]; goto FAILED; } /* In all case we no longer have a previous item. */ END_REPEAT: previous = NULL; break; /* Start of nested bracket sub-expression, or comment or lookahead or lookbehind or option setting or condition. First deal with special things that can come after a bracket; all are introduced by ?, and the appearance of any of them means that this is not a referencing group. They were checked for validity in the first pass over the string, so we don't have to check for syntax errors here. */ case '(': newoptions = options; skipbytes = 0; if (ptr == cd->end) { *errorptr = pcre_estrings[22]; goto FAILED; } if (*(++ptr) == '?') { int set, unset; int *optset; if (ptr == cd->end) { *errorptr = pcre_estrings[22]; goto FAILED; } switch (*(++ptr)) { case '#': /* Comment; skip to ket */ ptr++; while (ptr <= cd->end && *ptr != ')') ptr++; continue; case ':': /* Non-capturing bracket */ bravalue = OP_BRA; ptr++; break; case '(': bravalue = OP_COND; /* Conditional group */ if (ptr < cd->end && (cd->ctypes[*(++ptr)] & ctype_digit) != 0) { int condref = *ptr - '0'; while (ptr < cd->end && *(++ptr) != ')') condref = condref * 10 + *ptr - '0'; if (condref == 0) { *errorptr = pcre_estrings[32]; goto FAILED; } ptr++; code[3] = OP_CREF; code[4] = condref >> 8; code[5] = condref & 255; skipbytes = 3; } else ptr--; break; case '=': /* Positive lookahead */ bravalue = OP_ASSERT; ptr++; break; case '!': /* Negative lookahead */ bravalue = OP_ASSERT_NOT; ptr++; break; case '<': /* Lookbehinds */ if (ptr < cd->end) ptr++; /* else stay on the < so we have a syntax error */ switch (*ptr) { case '=': /* Positive lookbehind */ bravalue = OP_ASSERTBACK; ptr++; break; case '!': /* Negative lookbehind */ bravalue = OP_ASSERTBACK_NOT; ptr++; break; default: /* Syntax error */ *errorptr = pcre_estrings[24]; goto FAILED; } break; case '>': /* One-time brackets */ bravalue = OP_ONCE; ptr++; break; case 'R': /* Pattern recursion */ *code++ = OP_RECURSE; ptr++; continue; default: /* Option setting */ set = unset = 0; optset = &set; while (ptr <= cd->end && *ptr != ')' && *ptr != ':') { switch (*ptr++) { case '-': optset = &unset; break; case 'i': *optset |= PCRE_CASELESS; break; case 'm': *optset |= PCRE_MULTILINE; break; case 's': *optset |= PCRE_DOTALL; break; case 'x': *optset |= PCRE_EXTENDED; break; case 'U': *optset |= PCRE_UNGREEDY; break; case 'X': *optset |= PCRE_EXTRA; break; default: *errorptr = pcre_estrings[12]; goto FAILED; } } /* Set up the changed option bits, but don't change anything yet. */ newoptions = (options | set) & (~unset); /* If the options ended with ')' this is not the start of a nested group with option changes, so the options change at this level. At top level there is nothing else to be done (the options will in fact have been set from the start of compiling as a result of the first pass) but at an inner level we must compile code to change the ims options if necessary, and pass the new setting back so that it can be put at the start of any following branches, and when this group ends, a resetting item can be compiled. */ if (*ptr == ')') { if ((options & PCRE_INGROUP) != 0 && (options & PCRE_IMS) != (newoptions & PCRE_IMS)) { *code++ = OP_OPT; *code++ = *optchanged = newoptions & PCRE_IMS; } options = newoptions; /* Change options at this level */ previous = NULL; /* This item can't be repeated */ continue; /* It is complete */ } /* If the options ended with ':' we are heading into a nested group with possible change of options. Such groups are non-capturing and are not assertions of any kind. All we need to do is skip over the ':'; the newoptions value is handled below. */ bravalue = OP_BRA; ptr++; } } /* Else we have a referencing group; adjust the opcode. If the bracket number is greater than EXTRACT_BASIC_MAX, we set the opcode one higher, and arrange for the true number to follow later, in an OP_BRANUMBER item. */ else { if (++(*brackets) > EXTRACT_BASIC_MAX) { bravalue = OP_BRA + EXTRACT_BASIC_MAX + 1; code[3] = OP_BRANUMBER; code[4] = *brackets >> 8; code[5] = *brackets & 255; skipbytes = 3; } else bravalue = OP_BRA + *brackets; } /* Process nested bracketed re. Assertions may not be repeated, but other kinds can be. Pass in a new setting for the ims options if they have changed. */ previous = (bravalue >= OP_ONCE) ? code : NULL; *code = bravalue; start = code; if (!compile_regex ( options | PCRE_INGROUP, /* Set for all nested groups */ ((options & PCRE_IMS) != (newoptions & PCRE_IMS)) ? newoptions & PCRE_IMS : -1, /* Pass ims options if changed */ brackets, /* Capturing bracket count */ &code, /* Where to put code (updated) */ &ptr, /* Input pointer (updated) */ errorptr, /* Where to put an error message */ (bravalue == OP_ASSERTBACK || bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */ skipbytes, /* Skip over OP_COND/OP_BRANUMBER */ &subreqchar, /* For possible last char */ &subcountlits, /* For literal count */ cd, /* Tables block */ compile_branch_perl)) goto FAILED; /* At the end of compiling, code is still pointing to the start of the group, while code has been updated to point past the end of the group and any option resetting that may follow it. The pattern pointer (ptr) is on the bracket. */ /* If this is a conditional bracket, check that there are no more than two branches in the group. */ else if (bravalue == OP_COND) { uschar *tc = start; condcount = 0; do { condcount++; tc += (tc[1] << 8) | tc[2]; } while (*tc != OP_KET); if (condcount > 2) { *errorptr = pcre_estrings[27]; goto FAILED; } } /* Handle updating of the required character. If the subpattern didn't set one, leave it as it was. Otherwise, update it for normal brackets of all kinds, forward assertions, and conditions with two branches. Don't update the literal count for forward assertions, however. If the bracket is followed by a quantifier with zero repeat, we have to back off. Hence the definition of prevreqchar and subcountlits outside the main loop so that they can be accessed for the back off. */ if (subreqchar > 0 && (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_ASSERT || (bravalue == OP_COND && condcount == 2))) { prevreqchar = *reqchar; *reqchar = subreqchar; if (bravalue != OP_ASSERT) *countlits += subcountlits; } /* Error if hit end of pattern */ if (ptr > cd->end || *ptr != ')') { *errorptr = pcre_estrings[22]; goto FAILED; } break; /* Check \ for being a real metacharacter; if not, fall through and handle it as a data character at the start of a string. Escape items are checked for validity in the pre-compiling pass. */ case '\\': tempptr = ptr; c = check_escape (&ptr, errorptr, *brackets, options, FALSE, cd); /* Handle metacharacters introduced by \. For ones like \d, the ESC_ values are arranged to be the negation of the corresponding OP_values. For the back references, the values are ESC_REF plus the reference number. Only back references and those types that consume a character may be repeated. */ if (c < 0) { c = -c; if (c >= ESC_REF) { int number = c - ESC_REF; previous = code; *code++ = OP_REF; *code++ = number >> 8; *code++ = number & 255; } else if (c >= ESC_FIRST_CONSUME && c <= ESC_LAST_CONSUME) { c -= ESC_FIRST_CONSUME; previous = code; *code++ = (c & 1) ? OP_TYPE : OP_TYPENOT; *code++ = (c >> 1) + 1; } else { previous = NULL; *code++ = c; } continue; } /* Data character: reset and fall through */ ptr = tempptr; c = '\\'; /* Handle a run of data characters until a metacharacter is encountered. The first character is guaranteed not to be whitespace or # when the extended flag is set. */ NORMAL_CHAR: default: previous = code; *code = OP_CHARS; code += 2; length = 0; do { if ((options & PCRE_EXTENDED) != 0) { if ((cd->ctypes[c] & ctype_space) != 0) continue; if (c == '#') { /* The space before the ; is to avoid a warning on a silly compiler on the Macintosh. */ while ((c = *(++ptr)) != 0 && c != '\n'); if (c == 0) break; continue; } } /* Backslash may introduce a data char or a metacharacter. Escaped items are checked for validity in the pre-compiling pass. Stop the string before a metaitem. */ if (c == '\\') { tempptr = ptr; c = check_escape (&ptr, errorptr, *brackets, options, FALSE, cd); if (c < 0) { ptr = tempptr - 1; c = '\\'; break; } } /* Ordinary character or single-char escape */ *code++ = c; c = 0; length++; } /* This "while" is the end of the "do" above. */ while (length < MAXLIT && ptr < cd->end && (cd->ctypes[c = *(++ptr)] & ctype_meta) == 0); /* Update the last character and the count of literals */ prevreqchar = (length > 1) ? code[-2] : *reqchar; *reqchar = code[-1]; *countlits += length; /* Compute the length and set it in the data vector, and advance to the next state. */ previous[1] = length; if (cd->ctypes[c] & ctype_meta) ptr--; break; } } /* end of big loop */ SUCCEEDED: *codeptr = code; *ptrptr = ptr; return TRUE; /* Control never reaches here by falling through, only by a goto for all the error states. Pass back the position in the pattern so that it can be displayed to the user for diagnosing the error. */ FAILED: *ptrptr = ptr; return FALSE; } /************************************************* * Compile a Regular Expression * *************************************************/ /* This function takes a string and returns a pointer to a block of store holding a compiled version of the expression. Arguments: pattern the regular expression options various option bits errorptr pointer to pointer to error text erroroffset ptr offset in pattern where error was detected tables pointer to character tables or NULL Returns: pointer to compiled data block, or NULL on error, with errorptr and erroroffset set */ pcre * pcre_compile (pattern, options, errorptr, erroroffset, tables) const char *pattern; int options; const char **errorptr; int *erroroffset; const unsigned char *tables; { return pcre_compile_nuls (pattern, (int) strlen (pattern), options, errorptr, erroroffset, tables); } pcre * pcre_compile_nuls (pattern, patlen, options, errorptr, erroroffset, tables) const char *pattern; int patlen; int options; const char **errorptr; int *erroroffset; const unsigned char *tables; { pcre *re; int length = 3; /* For initial BRA plus length */ int runlength; int c, reqchar, countlits; int bracount = 0; int top_backref = 0; int branch_extra = 0; int branch_newextra; unsigned int brastackptr = 0; size_t size; uschar *code; const uschar *ptr; compile_data compile_block; int brastack[BRASTACK_SIZE]; uschar bralenstack[BRASTACK_SIZE]; static const unsigned char *def_tables; #ifdef DEBUG uschar *code_base, *code_end; #endif /* We can't pass back an error message if errorptr is NULL; I guess the best we can do is just return NULL. */ if (errorptr == NULL) return NULL; *errorptr = NULL; /* However, we can give a message for this error */ if (erroroffset == NULL) { *errorptr = pcre_estrings[16]; return NULL; } *erroroffset = 0; if ((options & ~PUBLIC_OPTIONS) != 0) { *errorptr = pcre_estrings[17]; return NULL; } /* Set up pointers to the individual character tables */ if (!tables) { if (!def_tables) def_tables = pcre_maketables (); tables = def_tables; } compile_block.lcc = tables + lcc_offset; compile_block.fcc = tables + fcc_offset; compile_block.cbits = tables + cbits_offset; compile_block.ctypes = tables + ctypes_offset; compile_block.end = pattern + patlen - 1; /* Reflect pattern for debugging output */ DPRINTF (("------------------------------------------------------------------\n")); DFWRITE ((pattern, 1, patlen, stdout)); DPRINTF (("\n")); /* The first thing to do is to make a pass over the pattern to compute the amount of store required to hold the compiled code. This does not have to be perfect as long as errors are overestimates. At the same time we can detect any internal flag settings. Make an attempt to correct for any counted white space if an "extended" flag setting appears late in the pattern. We can't be so clever for #-comments. */ for (ptr = (const uschar *) pattern; ptr <= compile_block.end; ptr++) { int min, max; int class_charcount; int bracket_length; c = *ptr; if ((options & PCRE_EXTENDED) != 0) { if ((compile_block.ctypes[c] & ctype_space) != 0) continue; if (c == '#') { /* The space before the ; is to avoid a warning on a silly compiler on the Macintosh. */ while ((c = *(++ptr)) != 0 && c != '\n'); continue; } } switch (c) { /* A backslashed item may be an escaped "normal" character or a character type. For a "normal" character, put the pointers and character back so that tests for whitespace etc. in the input are done correctly. */ case '\\': { const uschar *save_ptr = ptr; if (ptr == compile_block.end) *errorptr = pcre_estrings[1]; else c = check_escape (&ptr, errorptr, bracount, options, FALSE, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if (c >= 0) { ptr = save_ptr; c = '\\'; goto NORMAL_CHAR; } } /* A back reference needs an additional 2 bytes, plus either 0 or 4 bytes for a repeat. We also need to keep the value of the highest back reference. */ if (c <= -ESC_REF) { int refnum = -c - ESC_REF; if (refnum > top_backref) top_backref = refnum; length += 3; /* For single back reference */ if (ptr < compile_block.end && ptr[1] == '{' && is_counted_repeat (ptr + 2, &compile_block)) { min = max = 1; ptr = read_repeat_counts (ptr + 2, &min, &max, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) ; else length += 4; } } else if (c <= 0) length += 2; else length++; continue; case '.': if (ptr != compile_block.end && *(ptr + 1) == '{') length++; /* fall through */ case '^': case '$': case '*': /* These repeats won't be after brackets; */ case '+': /* those are handled separately */ case '?': length++; continue; /* This covers the cases of repeats after a single char, metachar, class, or back reference. */ case '{': if (!is_counted_repeat (ptr + 1, &compile_block)) goto NORMAL_CHAR; min = max = 1; ptr = read_repeat_counts (ptr + 1, &min, &max, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) length++; else { length--; /* Uncount the original char or metachar */ if (min == 1) length++; else if (min > 0) length += 4; if (max > 0) length += 4; else length += 2; } if (ptr < compile_block.end && ptr[1] == '?') ptr++; continue; /* An alternation contains an offset to the next branch or ket. If any ims options changed in the previous branch(es), and/or if we are in a lookbehind assertion, extra space will be needed at the start of the branch. This is handled by branch_extra. */ case '|': length += 3 + branch_extra; continue; /* A character class uses 33 characters. Don't worry about character types that aren't allowed in classes - they'll get picked up during the compile. A character class that contains only one character uses 2 or 3 bytes, depending on whether it is negated or not. Notice this where we can. */ case '[': class_charcount = 0; if (ptr < compile_block.end && *(++ptr) == '^') ptr++; if (ptr <= compile_block.end) do { if (*ptr == '\\') { int ch; if (ptr == compile_block.end) *errorptr = pcre_estrings[1]; else ch = check_escape (&ptr, errorptr, bracount, options, TRUE, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if (-ch == ESC_b) class_charcount++; else class_charcount = 10; } else class_charcount++; ptr++; } while (ptr <= compile_block.end && *ptr != ']'); /* Repeats for negated single chars are handled by the general code */ if (class_charcount == 1) length += 3; else { length += 33; /* A repeat needs either 0 or 4 bytes. */ if (ptr < compile_block.end && ptr[1] == '{' && is_counted_repeat (ptr + 2, &compile_block)) { min = max = 1; ptr = read_repeat_counts (ptr + 2, &min, &max, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) ; else length += 4; if (ptr < compile_block.end && ptr[1] == '?') ptr++; } } continue; /* Brackets may be genuine groups or special things */ case '(': branch_newextra = 0; bracket_length = 3; /* Handle special forms of bracket, which all start (? */ if (ptr < compile_block.end && ptr[1] == '?') { int set, unset; int *optset; switch (c = ptr[2]) { /* Skip over comments entirely */ case '#': ptr += 3; while (ptr < compile_block.end && *ptr != ')') ptr++; if (*ptr != ')') { *errorptr = pcre_estrings[18]; goto PCRE_ERROR_RETURN; } continue; /* Non-referencing groups and lookaheads just move the pointer on, and then behave like a non-special bracket, except that they don't increment the count of capturing brackets. Ditto for the "once only" bracket, which is in Perl from version 5.005. */ case ':': case '=': case '!': case '>': ptr += 2; break; /* A recursive call to the regex is an extension, to provide the facility which can be obtained by $(?p{perl-code}) in Perl 5.6. */ case 'R': if (ptr[3] != ')') { *errorptr = pcre_estrings[29]; goto PCRE_ERROR_RETURN; } ptr += 3; length += 1; break; /* Lookbehinds are in Perl from version 5.005 */ case '<': if (ptr[3] == '=' || ptr[3] == '!') { ptr += 3; branch_newextra = 3; length += 3; /* For the first branch */ break; } *errorptr = pcre_estrings[24]; goto PCRE_ERROR_RETURN; /* Conditionals are in Perl from version 5.005. The bracket must either be followed by a number (for bracket reference) or by an assertion group. */ case '(': if ((compile_block.ctypes[ptr[3]] & ctype_digit) != 0) { ptr += 4; length += 3; while ((compile_block.ctypes[*ptr] & ctype_digit) != 0) ptr++; if (*ptr != ')') { *errorptr = pcre_estrings[26]; goto PCRE_ERROR_RETURN; } } else /* An assertion must follow */ { ptr++; /* Can treat like ':' as far as spacing is concerned */ if (ptr[2] != '?' || (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<')) { ptr += 2; /* To get right offset in message */ *errorptr = pcre_estrings[28]; goto PCRE_ERROR_RETURN; } } break; /* Else loop checking valid options until ) is met. Anything else is an error. If we are without any brackets, i.e. at top level, the settings act as if specified in the options, so massage the options immediately. This is for backward compatibility with Perl 5.004. */ default: set = unset = 0; optset = &set; ptr += 2; for (;; ptr++) { c = *ptr; switch (c) { case 'i': *optset |= PCRE_CASELESS; continue; case 'm': *optset |= PCRE_MULTILINE; continue; case 's': *optset |= PCRE_DOTALL; continue; case 'x': *optset |= PCRE_EXTENDED; continue; case 'X': *optset |= PCRE_EXTRA; continue; case 'U': *optset |= PCRE_UNGREEDY; continue; case '-': optset = &unset; continue; /* A termination by ')' indicates an options-setting-only item; this is global at top level; otherwise nothing is done here and it is handled during the compiling process on a per-bracket-group basis. */ case ')': if (brastackptr == 0) { options = (options | set) & (~unset); set = unset = 0; /* To save length */ } /* Fall through */ /* A termination by ':' indicates the start of a nested group with the given options set. This is again handled at compile time, but we must allow for compiled space if any of the ims options are set. We also have to allow for resetting space at the end of the group, which is why 4 is added to the length and not just 2. If there are several changes of options within the same group, this will lead to an over-estimate on the length, but this shouldn't matter very much. We also have to allow for resetting options at the start of any alternations, which we do by setting branch_newextra to 2. Finally, we record whether the case-dependent flag ever changes within the regex. This is used by the "required character" code. */ case ':': if (((set | unset) & PCRE_IMS) != 0) { length += 4; branch_newextra = 2; if (((set | unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED; } goto END_OPTIONS; /* Unrecognized option character */ default: *errorptr = pcre_estrings[12]; goto PCRE_ERROR_RETURN; } } /* If we hit a closing bracket, that's it - this is a freestanding option-setting. We need to ensure that branch_extra is updated if necessary. The only values branch_newextra can have here are 0 or 2. If the value is 2, then branch_extra must either be 2 or 5, depending on whether this is a lookbehind group or not. */ END_OPTIONS: if (c == ')') { if (branch_newextra == 2 && (branch_extra == 0 || branch_extra == 3)) branch_extra += branch_newextra; continue; } /* If options were terminated by ':' control comes here. Fall through to handle the group below. */ } } /* Capturing brackets must be counted so we can process escapes in a Perlish way. If the number exceeds EXTRACT_BASIC_MAX we are going to need an additional 3 bytes of store per capturing bracket. */ else { bracount++; if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3; } /* Save length for computing whole length at end if there's a repeat that requires duplication of the group. Also save the current value of branch_extra, and start the new group with the new value. If non-zero, this will either be 2 for a (?imsx: group, or 3 for a lookbehind assertion. */ if (brastackptr >= sizeof (brastack) / sizeof (int)) { *errorptr = pcre_estrings[19]; goto PCRE_ERROR_RETURN; } bralenstack[brastackptr] = branch_extra; branch_extra = branch_newextra; brastack[brastackptr++] = length; length += bracket_length; continue; /* Handle ket. Look for subsequent max/min; for certain sets of values we have to replicate this bracket up to that many times. If brastackptr is 0 this is an unmatched bracket which will generate an error, but take care not to try to access brastack[-1] when computing the length and restoring the branch_extra value. */ case ')': length += 3; { int minval = 1; int maxval = 1; int duplength; if (brastackptr > 0) { duplength = length - brastack[--brastackptr]; branch_extra = bralenstack[brastackptr]; } else duplength = 0; /* Leave ptr at the final char; for read_repeat_counts this happens automatically; for the others we need an increment. */ if (ptr == compile_block.end) { } else if ((c = ptr[1]) == '{' && is_counted_repeat (ptr + 2, &compile_block)) { minval = maxval = 1; ptr = read_repeat_counts (ptr + 2, &minval, &maxval, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; } else if (c == '*') { minval = 0; maxval = -1; ptr++; } else if (c == '+') { maxval = -1; ptr++; } else if (c == '?') { minval = 0; ptr++; } /* If the minimum is zero, we have to allow for an OP_BRAZERO before the group, and if the maximum is greater than zero, we have to replicate maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting bracket set - hence the 7. */ if (minval == 0) { length++; if (maxval > 0) length += (maxval - 1) * (duplength + 7); } /* When the minimum is greater than zero, 1 we have to replicate up to minval-1 times, with no additions required in the copies. Then, if there is a limited maximum we have to replicate up to maxval-1 times allowing for a BRAZERO item before each optional copy and nesting brackets for all but one of the optional copies. */ else { length += (minval - 1) * duplength; if (maxval > minval) /* Need this test as maxval=-1 means no limit */ length += (maxval - minval) * (duplength + 7) - 6; } } continue; /* Non-special character. For a run of such characters the length required is the number of characters + 2, except that the maximum run length is 255. We won't get a skipped space or a non-data escape or the start of a # comment as the first character, so the length can't be zero. */ NORMAL_CHAR: default: length += 2; runlength = 0; do { if ((options & PCRE_EXTENDED) != 0) { if ((compile_block.ctypes[c] & ctype_space) != 0) continue; if (c == '#') { /* The space before the ; is to avoid a warning on a silly compiler on the Macintosh. */ while ((c = *(++ptr)) != 0 && c != '\n'); continue; } } /* Backslash may introduce a data char or a metacharacter; stop the string before the latter. */ if (c == '\\') { const uschar *saveptr = ptr; c = check_escape (&ptr, errorptr, bracount, options, FALSE, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if (c < 0) { ptr = saveptr - 1; c = '\\'; break; } } /* Ordinary character or single-char escape */ runlength++; c = 0; } /* This "while" is the end of the "do" above. */ while (runlength < MAXLIT && ptr <= compile_block.end && (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0); if (compile_block.ctypes[c] & ctype_meta) ptr--; length += runlength; continue; } } length += 4; /* For final KET and END */ if (length > 65539) { *errorptr = pcre_estrings[20]; return NULL; } /* Compute the size of data block needed and get it, either from malloc or externally provided function. We specify "code[0]" in the offsetof() expression rather than just "code", because it has been reported that one broken compiler fails on "code" because it is also an independent variable. It should make no difference to the value of the offsetof(). */ size = length + offsetof (pcre, code[0]); re = (pcre *) (pcre_malloc) (size); if (re == NULL) { *errorptr = pcre_estrings[21]; return NULL; } /* Put in the magic number, and save the size, options, and table pointer */ re->magic_number = MAGIC_NUMBER; re->size = size; re->options = options; re->tables = tables; /* Set up a starting, non-capturing bracket, then compile the expression. On error, *errorptr will be set non-NULL, so we don't need to look at the result of the function here. */ ptr = (const uschar *) pattern; code = re->code; *code = OP_BRA; bracount = 0; (void) compile_regex (options, -1, &bracount, &code, &ptr, errorptr, FALSE, 0, &reqchar, &countlits, &compile_block, compile_branch_perl); re->top_bracket = bracount; re->top_backref = top_backref; /* If not reached end of pattern on success, there's an excess bracket. */ if (*errorptr == NULL && ptr <= compile_block.end) *errorptr = pcre_estrings[22]; /* Fill in the terminating state and check for disastrous overflow, but if debugging, leave the test till after things are printed out. */ *code++ = OP_END; #ifndef DEBUG if (code - re->code > length) *errorptr = pcre_estrings[23]; #endif /* Give an error if there's back reference to a non-existent capturing subpattern. */ if (top_backref > re->top_bracket) *errorptr = pcre_estrings[15]; /* Failed to compile */ if (*errorptr != NULL) { (pcre_free) (re); PCRE_ERROR_RETURN: *erroroffset = ptr - (const uschar *) pattern; return NULL; } /* If the anchored option was not passed, set flag if we can determine that the pattern is anchored by virtue of ^ characters or \A or anything else (such as starting with .* when DOTALL is set). Otherwise, see if we can determine what the first character has to be, because that speeds up unanchored matches no end. If not, see if we can set the PCRE_STARTLINE flag. This is helpful for multiline matches when all branches start with ^. and also when all branches start with .* for non-DOTALL matches. */ if ((options & PCRE_ANCHORED) == 0) { int temp_options = options; if (is_anchored (re->code, &temp_options)) re->options |= PCRE_ANCHORED; else { int ch = find_firstchar (re->code, &temp_options); if (ch >= 0) { re->first_char = ch; re->options |= PCRE_FIRSTSET; } else if (is_startline (re->code)) re->options |= PCRE_STARTLINE; } } /* Save the last required character if there are at least two literal characters on all paths, or if there is no first character setting. */ if (reqchar >= 0 && (countlits > 1 || (re->options & PCRE_FIRSTSET) == 0)) { re->req_char = reqchar; re->options |= PCRE_REQCHSET; } re->max_match_size = -1; /* Print out the compiled data for debugging */ #ifdef DEBUG pcre_debug (re); if (code - re->code > length) { *errorptr = pcre_estrings[23]; (pcre_free) (re); *erroroffset = ptr - (uschar *) pattern; return NULL; } #endif if (*errorptr && (options & PCRE_ENGLISH_ERRORS) == 0) *errorptr = gettext(*errorptr); return (pcre *) re; } sed-3.62/pcre/regposix.c0000644000076600007660000014352310202631264012115 00000000000000 /************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ---------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* Include the internals header, which itself includes Standard C headers plus the external pcre header. */ #include "internal.h" /* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef inline, and there are *still* stupid compilers about that don't like indented pre-processor statements. I suppose it's only been 10 years... */ #ifdef DEBUG #define DPRINTF(p) printf p #define DFWRITE(p) fwrite p #else #define DPRINTF(p) /*nothing */ #define DFWRITE(p) /*nothing */ #endif /* Allow compilation as C++ source code, should anybody want to do that. */ #ifdef __cplusplus #define class pcre_class #endif /* Maximum number of items on the nested bracket stacks at compile time. This applies to the nesting of all kinds of parentheses. It does not limit un-nested, non-capturing parentheses. This number can be made bigger if necessary - it is used to dimension one int and one unsigned char vector at compile time. */ #define BRASTACK_SIZE 200 /* The number of bytes in a literal character string above which we can't add any more. */ #define MAXLIT 255 /* Text forms of OP_ values and things, for debugging (not all used) */ /* Table for handling escaped characters in the range ' '-'z'. Positive returns are simple data values; negative values are for special things like \d and so on. Zero means further processing is needed (for things like \x), or the escape is invalid. */ static const short int escapes[] = { 0, 0, 0, 0, 0, 0, 0, -ESC_z, /* space - ' */ 0, 0, 0, 0, 0, 0, 0, 0, /* ( - / */ 0, -ESC_REF - 1, -ESC_REF - 2, /* 0 - 8 */ -ESC_REF - 3, -ESC_REF - 4, -ESC_REF - 5, -ESC_REF - 6, -ESC_REF - 7, -ESC_REF - 8, -ESC_REF - 9, ':', ';', -ESC_LESS, '=', -ESC_GREATER, '?', /* 9 - ? */ '@', 0, -ESC_B, 0, 0, 0, 0, -ESC_G, /* @ - G */ 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ 0, 0, 0, -ESC_S, 0, 0, 0, -ESC_W, /* P - W */ 0, 0, 0, '[', '\\', ']', '^', '_', /* X - _ */ -ESC_A, 7, -ESC_b, 0, 0, 27, '\f', 0, /* ` - g */ 0, 0, 0, 0, 0, 0, '\n', 0, /* h - o */ 0, 0, '\r', -ESC_s, '\t', 0, '\v', -ESC_w, /* p - w */ 0, 0, 0 /* x - z */ }; #include "regcomp.c" /************************************************* * Handle escapes * *************************************************/ /* This function is called when a \ has been encountered. It either returns a positive value for a simple escape such as \n, or a negative value which encodes one of the more complicated things such as \d. On entry, ptr is pointing at the \. On exit, it is on the final character of the escape sequence. Arguments: ptrptr points to the pattern position pointer errorptr points to the pointer to the error message bracount number of previous capturing brackets options the options bits isclass TRUE if inside a character class cd pointer to char tables block Returns: zero or positive => a data character negative => a special escape sequence on error, errorptr is set */ static int check_escape (ptrptr, errorptr, bracount, options, isclass, cd) const uschar **ptrptr; const char **errorptr; int bracount; int options; BOOL isclass; compile_data *cd; { const uschar *ptr = *ptrptr; int c, i; c = *(++ptr); /* Digits or letters may have special meaning; all others are literals. */ if (c < ' ' || c > 'z') { if (isclass) { c = '\\'; --ptr; } } /* Do an initial lookup in a table. A > zero result is something that can be returned immediately. A < zero is a literal inside a class, a special operator outside brackets. Otherwise further processing may be required. */ else if (((i = escapes[c - ' ']) < 0 || i == c) && isclass) { c = '\\'; --ptr; } else if (i != 0) c = i; /* Escapes that need further processing, or are illegal. */ else { const uschar *oldptr; switch (c) { case 'o': if (ptr == cd->end || (cd->ctypes[ptr[1]] & ctype_digit) == 0 || ptr[1] == '8' || ptr[1] == '9') break; c = 0; do c = c * 8 + *(++ptr) - '0'; while (++i < 3 && ptr < cd->end && (cd->ctypes[ptr[1]] & ctype_digit) != 0 && ptr[1] != '8' && ptr[1] != '9'); c &= 255; /* Take least significant 8 bits */ break; case 'd': if (ptr == cd->end || (cd->ctypes[ptr[1]] & ctype_digit) == 0) break; c = 0; do c = c * 10 + *(++ptr) - '0'; while (++i < 3 && ptr < cd->end && (cd->ctypes[ptr[1]] & ctype_digit) != 0); c &= 255; /* Take least significant 8 bits */ break; case 'x': /* Read just a single hex char */ if (ptr == cd->end || (cd->ctypes[ptr[1]] & ctype_xdigit) == 0) break; c = 0; do { ptr++; c = c * 16 + cd->lcc[*ptr] - (((cd->ctypes[*ptr] & ctype_digit) != 0) ? '0' : 'a' - 10); } while (++i < 2 && ptr < cd->end && (cd->ctypes[ptr[1]] & ctype_xdigit) != 0); break; case 'c': if ((++ptr) > cd->end || (c = *ptr) == 0) { *errorptr = pcre_estrings[2]; return 0; } /* A letter is upper-cased; then the 0x40 bit is flipped */ if (c >= 'a' && c <= 'z') c = cd->fcc[c]; c ^= 0x40; break; default: if (isclass) { c = '\\'; --ptr; } break; } } *ptrptr = ptr; return c; } /************************************************* * Compile one branch * *************************************************/ /* Scan the pattern, compiling it into the code vector. Arguments: options the option bits brackets points to number of capturing brackets used code points to the pointer to the current code point ptrptr points to the current pattern pointer errorptr points to pointer to error message optchanged set to the value of the last OP_OPT item compiled reqchar set to the last literal character required, else -1 countlits set to count of mandatory literal characters cd contains pointers to tables Returns: TRUE on success FALSE, with *errorptr set on error */ static BOOL compile_branch_posix (options, brackets, codeptr, ptrptr, errorptr, optchanged, reqchar, countlits, cd) int options; int *brackets; uschar **codeptr; const uschar **ptrptr; const char **errorptr; int *optchanged; int *reqchar; int *countlits; compile_data *cd; { int repeat_min, repeat_max; int bravalue, length; int greedy_default; int prevreqchar; int condcount = 0; int subcountlits = 0; BOOL first = TRUE; int c; uschar *code = *codeptr; const uschar *ptr = *ptrptr; const uschar *tempptr; uschar *previous = NULL; uschar class[32]; /* Set up the settings for greediness */ greedy_default = ((options & PCRE_UNGREEDY) != 0); /* Initialize no required char, and count of literals */ *reqchar = prevreqchar = -1; *countlits = 0; /* Initialize standard {1,1} repeats */ repeat_min = repeat_max = 1; /* Switch on next character until the end of the branch */ for (;; first = FALSE, ptr++) { BOOL negate_class; int class_charcount; int class_lastchar; int newoptions; int skipbytes; int subreqchar; c = (ptr > cd->end) ? 0 : *ptr; if ((repeat_min != 1 || repeat_max != 1) && (c != '*' && c != '+' && c != '?' && c != '{')) { int op_type; int repeat_type; if (*previous == OP_CIRC || *previous == OP_DOLL || (*previous >= ESC_LESS && *previous < ESC_FIRST_CONSUME) || (*previous > ESC_LAST_CONSUME && *previous <= ESC_z)) { /* Handle assertions: ^* --> , ^{1,3} --> ^ */ if (repeat_min == 0) code = previous; goto END_REPEAT; } repeat_type = greedy_default; /* If previous was a string of characters, chop off the last one and use it as the subject of the repeat. If there was only one character, we can abolish the previous item altogether. A repeat with a zero minimum wipes out any reqchar setting, backing up to the previous value. We must also adjust the countlits value. */ if (*previous == OP_CHARS) { int len = previous[1]; if (repeat_min == 0) *reqchar = prevreqchar; *countlits += repeat_min - 1; if (len == 1) { c = previous[2]; code = previous; } else { c = previous[len + 1]; previous[1]--; code--; } op_type = 0; /* Use single-char op codes */ goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */ } /* If previous was a single negated character ([^a] or similar), we use one of the special opcodes, replacing it. The code is shared with single- character repeats by adding a suitable offset into repeat_type. */ else if ((int) *previous == OP_NOT) { op_type = OP_NOT - OP_CHARS; /* Use "not" opcodes */ c = previous[1]; code = previous; goto OUTPUT_SINGLE_REPEAT; } /* If previous was a character type match (\d or similar), abolish it and create a suitable repeat item. The code is shared with single-character repeats by adding a suitable offset into repeat_type. */ else if (*previous == OP_TYPE || *previous == OP_TYPENOT || *previous == OP_ANY) { if (*previous == OP_ANY) { c = 0; *previous = OP_TYPENOT; } else c = previous[1]; op_type = *previous - OP_CHARS; code = previous; OUTPUT_SINGLE_REPEAT: cd->max_match_size += repeat_max - 1; /* If the maximum is zero then the minimum must also be zero; Perl allows this case, so we do too - by simply omitting the item altogether. */ if (repeat_max == 0) goto END_REPEAT; /* Combine the op_type with the repeat_type */ repeat_type += op_type; /* A minimum of zero is handled either as the special case * or ?, or as an UPTO, with the maximum given. */ if (repeat_min == 0) { if (repeat_max == -1) *code++ = OP_MAXSTAR + repeat_type; else if (repeat_max == 1) *code++ = OP_MAXQUERY + repeat_type; else { *code++ = OP_MAXUPTO + repeat_type; *code++ = repeat_max >> 8; *code++ = (repeat_max & 255); } } /* The case {1,} is handled as the special case + */ else if (repeat_min == 1 && repeat_max == -1) *code++ = OP_MAXPLUS + repeat_type; /* The case {n,n} is just an EXACT, while the general case {n,m} is handled as an EXACT followed by an UPTO. An EXACT of 1 is optimized. */ else { if (repeat_min != 1) { *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */ *code++ = repeat_min >> 8; *code++ = (repeat_min & 255); } /* If the mininum is 1 and the previous item was a character string, we either have to put back the item that got cancelled if the string length was 1, or add the character back onto the end of a longer string. For a character type nothing need be done; it will just get put back naturally. Note that the final character is always going to get added below. */ else if (*previous == OP_CHARS) { if (code == previous) code += 2; else previous[1]++; } /* For negated characters or classes we also have to put back the item that got cancelled. */ else if (*previous == OP_NOT || *previous == OP_TYPE || *previous == OP_TYPENOT) code++; /* If the maximum is unlimited, insert an OP_MAXSTAR. */ if (repeat_max < 0) { *code++ = c; *code++ = OP_MAXSTAR + repeat_type; } /* Else insert an UPTO if the max is greater than the min. */ else if (repeat_max != repeat_min) { *code++ = c; repeat_max -= repeat_min; *code++ = OP_MAXUPTO + repeat_type; *code++ = repeat_max >> 8; *code++ = (repeat_max & 255); } } /* The character or character type itself comes last in all cases. */ *code++ = c; } /* If previous was a character class or a back reference, we put the repeat stuff after it, but just skip the item if the repeat was {0,0}. */ else if (*previous == OP_CLASS || *previous == OP_REF) { if (repeat_max == 0) { code = previous; goto END_REPEAT; } if (*previous == OP_CLASS) cd->max_match_size += repeat_max - 1; else repeat_type += OP_REF - OP_CLASS; if (repeat_min == 0 && repeat_max == -1) *previous = OP_CL_MAXSTAR + repeat_type; else if (repeat_min == 1 && repeat_max == -1) *previous = OP_CL_MAXPLUS + repeat_type; else if (repeat_min == 0 && repeat_max == 1) *previous = OP_CL_MAXQUERY + repeat_type; else { *previous = OP_CL_MAXRANGE + repeat_type; *code++ = repeat_min >> 8; *code++ = repeat_min & 255; if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */ *code++ = repeat_max >> 8; *code++ = repeat_max & 255; } } /* If previous was a bracket group, we may have to replicate it in certain cases. */ else if ((int) *previous >= OP_BRA) { int i; int ketoffset = 0; int len = code - previous; /* If the maximum repeat count is unlimited, find the end of the bracket by scanning through from the start, and compute the offset back to it from the current code pointer. There may be an OP_OPT setting following the final KET, so we can't find the end just by going back from the code pointer. */ if (repeat_max == -1) { uschar *ket = previous; do ket += (ket[1] << 8) + ket[2]; while (*ket != OP_KET); ketoffset = code - ket; } else cd->max_match_size += subcountlits * (repeat_max - 1); /* The case of a zero minimum is special because of the need to stick OP_BRAZERO in front of it, and because the group appears once in the data, whereas in other cases it appears the minimum number of times. For this reason, it is simplest to treat this case separately, as otherwise the code gets far too messy. There are several special subcases when the minimum is zero. */ if (repeat_min == 0) { /* If we set up a required char from the bracket, we must back off to the previous value and reset the countlits value too. */ if (subcountlits > 0) { *reqchar = prevreqchar; *countlits -= subcountlits; } /* If the maximum is also zero, we just omit the group from the output altogether. */ if (repeat_max == 0) { code = previous; goto END_REPEAT; } /* If the maximum is 1 or unlimited, we just have to stick in the BRAZERO and do no more at this point. */ if (repeat_max <= 1) { memmove (previous + 1, previous, len); code++; *previous++ = OP_BRAZERO + repeat_type; } /* If the maximum is greater than 1 and limited, we have to replicate in a nested fashion, sticking OP_BRAZERO before each set of brackets. The first one has to be handled carefully because it's the original copy, which has to be moved up. The remainder can be handled by code that is common with the non-zero minimum case below. We just have to adjust the value or repeat_max, since one less copy is required. */ else { int offset; memmove (previous + 1, previous, len); code += 1; *previous++ = OP_BRAZERO + repeat_type; } repeat_max--; } /* If the minimum is greater than zero, replicate the group as many times as necessary, and adjust the maximum to the number of subsequent copies that we need. */ else { for (i = 1; i < repeat_min; i++) { memcpy (code, previous, len); code += len; } if (repeat_max > 0) repeat_max -= repeat_min; } /* This code is common to both the zero and non-zero minimum cases. If the maximum is limited, it replicates the group in a nested fashion, remembering the bracket starts on a stack. In the case of a zero minimum, the first one was set up above. In all cases the repeat_max now specifies the number of additional copies needed. */ if (repeat_max >= 0) { for (i = repeat_max - 1; i >= 0; i--) { *code++ = OP_BRAZERO + repeat_type; memcpy (code, previous, len); code += len; } } /* If the maximum is unlimited, set a repeater in the final copy. We can't just offset backwards from the current code point, because we don't know if there's been an options resetting after the ket. The correct offset was computed above. */ else code[-ketoffset] = OP_KET_MAXSTAR + repeat_type; } /* Else there's some kind of shambles */ else { *errorptr = pcre_estrings[11]; goto FAILED; } if (repeat_max == -1) /* An unlimited repeat forces us to disable this optimization */ cd->max_match_size = INT_MIN; /* In all case we no longer have a previous item. */ END_REPEAT: previous = NULL; repeat_min = 1; repeat_max = 1; } if (ptr > cd->end) break; c = *ptr; switch (c) { /* The branch terminates at end of string, |, or ). */ case '|': case ')': goto SUCCEEDED; /* Handle single-character metacharacters */ case '^': if (!first) goto NORMAL_CHAR; previous = code; *code++ = OP_CIRC; break; case '$': if (ptr < cd->end && ptr[1] != '|' && ptr[1] != ')') goto NORMAL_CHAR; previous = NULL; /* Perl has different semantics than POSIX for dollars, when multiline mode is not in effect */ *code++ = (options & PCRE_MULTILINE) ? OP_DOLL : OP_EOD; break; case '.': previous = code; cd->max_match_size++; *code++ = OP_ANY; break; /* Character classes. These always build a 32-byte bitmap of the permitted characters, except in the special case where there is only one character. For negated classes, we build the map as usual, then invert it at the end. */ case '[': previous = code; cd->max_match_size++; *code++ = OP_CLASS; /* If the first character is '^', set the negation flag and skip it. */ if ((c = *(++ptr)) == '^') { negate_class = TRUE; c = *(++ptr); } else negate_class = FALSE; /* Keep a count of chars so that we can optimize the case of just a single character. */ class_charcount = 0; class_lastchar = -1; /* Initialize the 32-char bit map to all zeros. We have to build the map in a temporary bit of store, in case the class contains only 1 character, because in that case the compiled code doesn't use the bit map. */ memset (class, 0, 32 * sizeof (uschar)); /* Process characters until ] is reached. By writing this as a "do" it means that an initial ] is taken as a data character. We also have to take care of this in the `if' below: it is an error if we reach the last character and we have not added a data character yet, because a closing bracket will not be considered as a terminator. */ do { if (ptr > cd->end || (ptr == cd->end && *ptr != ']') || (ptr == cd->end && class_charcount == 0)) { *errorptr = pcre_estrings[6]; goto FAILED; } /* Recognize the POSIX constructions [.ch.] and [=ch=] for a single character. */ if (c == '[' && (cd->end + 1) - ptr >= 5 && (ptr[1] == '.' || ptr[1] == '=') && ptr[3] == ptr [1] && ptr[4] == ']') { c = ptr[2]; /* A further ++ptr is done below. */ ptr += 4; } /* Handle POSIX class names. A square bracket that doesn't match the syntax is treated as a literal. We also recognize the POSIX constructions [.ch.] and [=ch=] ("collating elements") and fault them, as Perl 5.6 does. */ else if (c == '[' && (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && check_posix_syntax (ptr, &tempptr, cd)) { int posix_class, i; const uschar *cbits = cd->cbits; if (ptr[1] != ':') { *errorptr = pcre_estrings[31]; goto FAILED; } ptr += 2; posix_class = check_posix_name (ptr, tempptr - ptr); if (posix_class < 0) { *errorptr = pcre_estrings[30]; goto FAILED; } /* If matching is caseless, upper and lower are converted to alpha. This relies on the fact that the class table starts with alpha, lower, upper as the first 3 entries. */ if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) posix_class = 0; /* Or into the map we are building up to 3 of the static class tables, or their negations. */ posix_class *= 3; for (i = 0; i < 3; i++) { int taboffset = posix_class_maps[posix_class + i]; if (taboffset < 0) break; for (c = 0; c < 32; c++) class[c] |= cbits[c + taboffset]; } ptr = tempptr + 1; class_charcount = 10; /* Set > 1; assumes more than 1 per class */ continue; } /* Escapes inside character classes are not POSIX */ else if (c == '\\') c = check_escape (&ptr, errorptr, *brackets, options, TRUE, cd); /* A single character may be followed by '-' to form a range. However, Perl and POSIX do not permit ']' to be the end of the range. An hyphen here is treated as a literal. */ if (ptr[1] == '-' && ptr[2] != ']') { int d; ptr += 2; if (ptr > cd->end) { *errorptr = pcre_estrings[6]; goto FAILED; } d = *ptr; if (d == '\\') d = check_escape (&ptr, errorptr, *brackets, options, TRUE, cd); if (d < c) { *errorptr = pcre_estrings[8]; goto FAILED; } for (; c <= d; c++) { class[c / 8] |= (1 << (c & 7)); if ((options & PCRE_CASELESS) != 0) { int uc = cd->fcc[c]; /* flip case */ class[uc / 8] |= (1 << (uc & 7)); } class_charcount++; /* in case a one-char range */ class_lastchar = c; } continue; /* Go get the next char in the class */ } /* Handle a lone single character */ class[c / 8] |= (1 << (c & 7)); if ((options & PCRE_CASELESS) != 0) { c = cd->fcc[c]; /* flip case */ class[c / 8] |= (1 << (c & 7)); } class_charcount++; class_lastchar = c; } /* Loop until ']' reached; the check for end of string happens inside the loop. This "while" is the end of the "do" above. */ while ((c = *(++ptr)) != ']'); /* If class_charcount is 1 and class_lastchar is not negative, we saw precisely one character. This doesn't need the whole 32-byte bit map. We turn it into a 1-character OP_CHAR if it's positive, or OP_NOT if it's negative. */ if (class_charcount == 1 && class_lastchar >= 0) { if (negate_class) { code[-1] = OP_NOT; } else { code[-1] = OP_CHARS; *code++ = 1; } *code++ = class_lastchar; } /* Otherwise, negate the 32-byte map if necessary, and copy it into the code vector. */ else { if (negate_class) for (c = 0; c < 32; c++) code[c] = ~class[c]; else memcpy (code, class, 32); code += 32; } break; /* Various kinds of repeat */ case '{': if (previous == NULL) goto NORMAL_CHAR; if (!is_counted_repeat (ptr + 1, cd)) *errorptr = pcre_estrings[14]; else { ptr = read_repeat_counts (ptr + 1, &repeat_min, &repeat_max, errorptr, cd); if (*errorptr != NULL) goto FAILED; } break; case '*': if (previous == NULL) goto NORMAL_CHAR; repeat_min = 0; repeat_max = -1; break; case '+': if (previous == NULL) goto NORMAL_CHAR; repeat_max = -1; break; case '?': if (previous == NULL) goto NORMAL_CHAR; repeat_min = 0; break; /* Start of nested bracket sub-expression. */ case '(': newoptions = options; skipbytes = 0; if (ptr == cd->end) { *errorptr = pcre_estrings[22]; goto FAILED; } /* In POSIX we always have a referencing group; adjust the opcode. If the bracket number is greater than EXTRACT_BASIC_MAX, we set the opcode one higher, and arrange for the true number to follow later, in an OP_BRANUMBER item. */ ptr++; if (++(*brackets) > EXTRACT_BASIC_MAX) { bravalue = OP_BRA + EXTRACT_BASIC_MAX + 1; code[3] = OP_BRANUMBER; code[4] = *brackets >> 8; code[5] = *brackets & 255; skipbytes = 3; } else bravalue = OP_BRA + *brackets; /* Process nested bracketed re. Assertions may not be repeated, but other kinds can be. Pass in a new setting for the ims options if they have changed. */ previous = code; *code = bravalue; if (!compile_regex (options | PCRE_INGROUP, /* Set for all nested groups */ ((options & PCRE_IMS) != (newoptions & PCRE_IMS)) ? newoptions & PCRE_IMS : -1, /* Pass ims options if changed */ brackets, /* Capturing bracket count */ &code, /* Where to put code (updated) */ &ptr, /* Input pointer (updated) */ errorptr, /* Where to put an error message */ FALSE, /* Whether this is a lookbehind assertion */ skipbytes, /* Skip over OP_BRANUMBER */ &subreqchar, /* For possible last char */ &subcountlits, /* For literal count */ cd, /* Tables block */ compile_branch_posix)) goto FAILED; /* At the end of compiling, code is still pointing to the start of the group, while code has been updated to point past the end of the group and any option resetting that may follow it. The pattern pointer (ptr) is on the bracket. */ /* Handle updating of the required character. If the subpattern didn't set one, leave it as it was. Otherwise, update it for normal brackets of all kinds, forward assertions, and conditions with two branches. Don't update the literal count for forward assertions, however. If the bracket is followed by a quantifier with zero repeat, we have to back off. Hence the definition of prevreqchar and subcountlits outside the main loop so that they can be accessed for the back off. */ if (subreqchar > 0 && bravalue >= OP_BRA) { prevreqchar = *reqchar; *reqchar = subreqchar; *countlits += subcountlits; } /* Error if hit end of pattern */ if (ptr > cd->end || *ptr != ')') { *errorptr = pcre_estrings[14]; goto FAILED; } break; /* Check \ for being a real metacharacter; if not, fall through and handle it as a data character at the start of a string. Escape items are checked for validity in the pre-compiling pass. */ case '\\': tempptr = ptr; c = check_escape (&ptr, errorptr, *brackets, options, FALSE, cd); /* Handle metacharacters introduced by \. For ones like \d, the ESC_ values are arranged to be the negation of the corresponding OP_values. For the back references, the values are ESC_REF plus the reference number. Only back references and those types that consume a character may be repeated. */ if (c < 0) { c = -c; if (c >= ESC_REF) { int number = c - ESC_REF; previous = code; *code++ = OP_REF; *code++ = number >> 8; *code++ = number & 255; } else if (c >= ESC_FIRST_CONSUME && c <= ESC_LAST_CONSUME) { c -= ESC_FIRST_CONSUME; previous = code; *code++ = (c & 1) ? OP_TYPE : OP_TYPENOT; *code++ = (c >> 1) + 1; } else { previous = NULL; *code++ = c; } continue; } /* Data character: reset and fall through */ ptr = tempptr; c = '\\'; /* Handle a run of data characters until a metacharacter is encountered. The first character is guaranteed not to be whitespace or # when the extended flag is set. */ NORMAL_CHAR: default: previous = code; *code = OP_CHARS; code += 2; length = 0; do { /* Backslash may introduce a data char or a metacharacter. Escaped items are checked for validity in the pre-compiling pass. Stop the string before a metaitem. */ if (c == '\\') { tempptr = ptr; c = check_escape (&ptr, errorptr, *brackets, options, FALSE, cd); if (c < 0) { ptr = tempptr - 1; c = '\\'; break; } } /* Ordinary character or single-char escape */ *code++ = c; cd->max_match_size++; length++; c = 0; } /* This "while" is the end of the "do" above. */ while (length < MAXLIT && ptr < cd->end && (cd->ctypes[c = *(++ptr)] & ctype_meta) == 0); /* Update the last character and the count of literals */ prevreqchar = (length > 1) ? code[-2] : *reqchar; *reqchar = code[-1]; *countlits += length; /* Compute the length and set it in the data vector, and advance to the next state. */ previous[1] = length; if (cd->ctypes[c] & ctype_meta) ptr--; break; } } /* end of big loop */ SUCCEEDED: *codeptr = code; *ptrptr = ptr; return TRUE; /* Control never reaches here by falling through, only by a goto for all the error states. Pass back the position in the pattern so that it can be displayed to the user for diagnosing the error. */ FAILED: *ptrptr = ptr; return FALSE; } /************************************************ * Handle Basic Regular Expressions * *************************************************/ char * basic_to_extended_regexp (s, patlen) const char *s; int *patlen; { char *d, *base; const char *start, *end; int literal; start = s; base = d = (pcre_malloc) (*patlen * 2 + 1); end = s + *patlen; while (s < end) switch (*s) { case '\\': s++; if (s == end) { *d++ = '\\'; break; } /* Remove the slash -- e.g. \+ --> + except before: ... */ switch (*s) { case '<': /* characters that form backslashed GNU */ case '>': /* extensions */ case '\'': case '`': case 'b': case 'B': case 'G': case 's': case 'S': case 'w': case 'W': case '1': /* digits */ case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': *d++ = '\\'; *d++ = *s++; literal = 0; break; case '+': case '{': if (!literal && s != start) { if (s[-1] == '^' || s[-1] == '(') /* Brace and plus are literals in ^\{, ^\+, (\{, (\+ */ literal = 1; } else literal = 0; *d++ = *s++; break; case '.': /* characters that are special in basic regexps too */ case '*': case '[': case '^': case '$': case 'a': /* characters that must be escaped in basic */ case 'f': /* regexps too based on GNU sed 3.02.80 */ case 'e': case 'n': case 'r': case 't': case 'v': case 'd': case 'o': case 'x': case '\n': case '\\': *d++ = '\\'; default: *d++ = *s++; literal = 1; break; } break; /* Skip character classes */ case '[': literal = 1; *d++ = *s++; if (s < end && *s == '^') *d++ = *s++; if (s < end && *s == ']') *d++ = *s++; while (s < end && *s != ']') *d++ = *s++; if (s < end && *s == ']') *d++ = *s++; break; case '^': literal = 0; *d++ = *s++; break; case '*': if (!literal && s != start) { if (s[-1] == '^' || s[-1] == '(') /* ^* and (* are a literal * */ literal = 1; } else literal = 0; *d++ = *s++; break; /* Add a slash if the character is special in extended regexps */ case '+': case '?': case '|': case '(': case ')': case '{': case '}': *d++ = '\\'; /* Fall through */ default: literal = 1; *d++ = *s++; } *patlen = d - base; return base; } void basic_regexp_erroroffset (s, offset) const char *s; int *offset; { (pcre_free) (basic_to_extended_regexp (s, offset)); } /************************************************* * Compile a Regular Expression * *************************************************/ /* This function takes a string and returns a pointer to a block of store holding a compiled version of the expression. Arguments: pattern the regular expression options various option bits errorptr pointer to pointer to error text erroroffset ptr offset in pattern where error was detected tables pointer to character tables or NULL Returns: pointer to compiled data block, or NULL on error, with errorptr and erroroffset set */ pcre * pcre_posix_compile (pattern, options, errorptr, erroroffset, tables) const char *pattern; int options; const char **errorptr; int *erroroffset; const unsigned char *tables; { return pcre_posix_compile_nuls (pattern, (int) strlen (pattern), options, errorptr, erroroffset, tables); } pcre * pcre_posix_compile_nuls (pattern, patlen, options, errorptr, erroroffset, tables) const char *pattern; int patlen; int options; const char **errorptr; int *erroroffset; const unsigned char *tables; { pcre *re; int length = 3; /* For initial BRA plus length */ int runlength; int c, reqchar, countlits, prev; int bracount = 0; int top_backref = 0; int branch_extra = 0; int branch_newextra; unsigned int brastackptr = 0; size_t size; uschar *code; const uschar *ptr; compile_data compile_block; int brastack[BRASTACK_SIZE]; uschar bralenstack[BRASTACK_SIZE]; static const unsigned char *def_tables; #ifdef DEBUG uschar *code_base, *code_end; #endif /* We can't pass back an error message if errorptr is NULL; I guess the best we can do is just return NULL. */ if (errorptr == NULL) return NULL; *errorptr = NULL; /* However, we can give a message for this error */ if (erroroffset == NULL) { *errorptr = pcre_estrings[16]; return NULL; } *erroroffset = 0; if ((options & ~PUBLIC_OPTIONS) != 0) { *errorptr = pcre_estrings[17]; return NULL; } /* Call ourselves recursively with an extended regular expression if we were given a basic one. Extended regular expressions are similar to Perl's than basic regular expression, so we share most of the code with regperl.c if we work this way. */ if (!(options & PCRE_EXTENDED)) { uschar *ere = basic_to_extended_regexp (pattern, &patlen); re = pcre_posix_compile_nuls (ere, patlen, options | PCRE_EXTENDED, errorptr, erroroffset, tables); if (*errorptr != NULL) basic_regexp_erroroffset (ere, erroroffset); (pcre_free) (ere); return re; } /* Set up pointers to the individual character tables */ if (!tables) { if (!def_tables) def_tables = pcre_maketables (); tables = def_tables; } compile_block.lcc = tables + lcc_offset; compile_block.fcc = tables + fcc_offset; compile_block.cbits = tables + cbits_offset; compile_block.ctypes = tables + ctypes_offset; compile_block.end = pattern + patlen - 1; compile_block.max_match_size = 0; /* Reflect pattern for debugging output */ DPRINTF ( ("------------------------------------------------------------------\n")); DFWRITE ((pattern, 1, patlen, stdout)); DPRINTF (("\n")); /* The first thing to do is to make a pass over the pattern to compute the amount of store required to hold the compiled code. This does not have to be perfect as long as errors are overestimates. At the same time we can detect any internal flag settings. */ for (prev = -1, ptr = (const uschar *) pattern; ptr <= compile_block.end; prev = c, ptr++) { int min = 1, max = 1; int class_charcount; int bracket_length; c = *ptr; switch (c) { /* A backslashed item may be an escaped "normal" character or a character type. For a "normal" character, put the pointers and character back so that tests for whitespace etc. in the input are done correctly. */ case '\\': { const uschar *save_ptr = ptr; if (ptr == compile_block.end) *errorptr = pcre_estrings[1]; else c = check_escape (&ptr, errorptr, bracount, options, FALSE, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if (c >= 0) { ptr = save_ptr; c = '\\'; goto NORMAL_CHAR; } } /* A back reference needs an additional 2 bytes, plus either zero or 4 bytes for a repeat. We also need to keep the value of the highest back reference. */ if (c <= -ESC_REF) { int refnum = -c - ESC_REF; if (refnum > top_backref) top_backref = refnum; length += 3; /* For single back reference */ if (ptr < compile_block.end && ptr[1] == '{' && is_counted_repeat (ptr + 2, &compile_block)) { ptr = read_repeat_counts (ptr + 2, &min, &max, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) ; else length += 4; } } else if (c <= 0) length += 2; else length++; continue; case '*': /* These repeats won't be after brackets; */ case '+': /* those are handled separately */ case '?': if (prev == -1) goto NORMAL_CHAR; case '.': length += (ptr != compile_block.end && *(ptr + 1) == '{') ? 2 : 1; continue; /* This covers the cases of repeats after a single char, metachar, class, or back reference. */ case '{': if (!is_counted_repeat (ptr + 1, &compile_block)) goto NORMAL_CHAR; ptr = read_repeat_counts (ptr + 1, &min, &max, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) length++; else { length--; /* Uncount the original char or metachar */ if (min == 1) length++; else if (min > 0) length += 4; if (max > 0) length += 4; else length += 2; } continue; /* An alternation contains an offset to the next branch or ket. If any ims options changed in the previous branch(es), extra space will be needed at the start of the branch. This is handled by branch_extra. */ case '|': length += 3 + branch_extra; continue; /* A character class uses 33 characters. Don't worry about character types that aren't allowed in classes - they'll get picked up during the compile. A character class that contains only one character uses 2 or 3 bytes, depending on whether it is negated or not. Notice this where we can. */ case '[': class_charcount = 0; if (ptr < compile_block.end && *(++ptr) == '^') ptr++; if (ptr <= compile_block.end) do { if (*ptr == '\\') { if (ptr == compile_block.end) { /* Lone backslash, signal an error */ *errorptr = pcre_estrings[1]; goto PCRE_ERROR_RETURN; } else { int i; /* Inside a class, literal escapes are interpreted as a separate backslash followed by another character. */ c = ptr[1]; if (c >= ' ' && c <= 'z' && (i == escapes[c - ' '] > 0) && i != c) { class_charcount++; ptr++; } } } class_charcount++; ptr++; } while (ptr <= compile_block.end && *ptr != ']'); /* Repeats for negated single chars are handled by the general code */ if (class_charcount == 1) length += 3; else { length += 33; /* A repeat needs either 0 or 4 bytes. */ if (ptr < compile_block.end && ptr[1] == '{' && is_counted_repeat (ptr + 2, &compile_block)) { ptr = read_repeat_counts (ptr + 2, &min, &max, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) ; else length += 4; } } continue; /* Brackets may be genuine groups or special things */ case '(': branch_newextra = 0; bracket_length = 3; /* Capturing brackets must be counted so we can process escapes in a Perlish way. */ bracount++; if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3; /* Save length for computing whole length at end if there's a repeat that requires duplication of the group. Also save the current value of branch_extra, and start the new group with the new value. If non-zero, this will either be 2 for a (?imsx: group, or 3 for a lookbehind assertion. */ if (brastackptr >= sizeof (brastack) / sizeof (int)) { *errorptr = pcre_estrings[19]; goto PCRE_ERROR_RETURN; } bralenstack[brastackptr] = branch_extra; branch_extra = branch_newextra; brastack[brastackptr++] = length; length += bracket_length; /* Treat a *+? after a ( as a literal char */ c = -1; continue; /* Handle ket. Look for subsequent max/min; for certain sets of values we have to replicate this bracket up to that many times. If brastackptr is 0 this is an unmatched bracket which will generate an error, but take care not to try to access brastack[-1] when computing the length and restoring the branch_extra value. */ case ')': length += 3; { int minval = 1; int maxval = 1; int duplength; if (brastackptr > 0) { duplength = length - brastack[--brastackptr]; branch_extra = bralenstack[brastackptr]; } else duplength = 0; /* Leave ptr at the final char; for read_repeat_counts this happens automatically; for the others we need an increment. */ if (ptr == compile_block.end) { } else if ((c = ptr[1]) == '{' && is_counted_repeat (ptr + 2, &compile_block)) { ptr = read_repeat_counts (ptr + 2, &minval, &maxval, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; } else if (c == '*') { minval = 0; maxval = -1; ptr++; } else if (c == '+') { maxval = -1; ptr++; } else if (c == '?') { minval = 0; ptr++; } /* If the minimum is zero, we have to allow for an OP_BRAZERO before the group, and if the maximum is greater than zero, we have to replicate maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting bracket set - hence the 7. */ if (minval == 0) { length++; if (maxval > 0) length += (maxval - 1) * (duplength + 7); } /* When the minimum is greater than zero, 1 we have to replicate up to minval-1 times, with no additions required in the copies. Then, if there is a limited maximum we have to replicate up to maxval-1 times allowing for a BRAZERO item before each optional copy and nesting brackets for all but one of the optional copies. */ else { length += (minval - 1) * duplength; if (maxval > minval) /* Need this test as maxval=-1 means no limit */ length += (maxval - minval) * (duplength + 7) - 6; } } continue; /* Non-special character. For a run of such characters the length required is the number of characters + 2, except that the maximum run length is 255. We won't get a skipped space or a non-data escape or the start of a # comment as the first character, so the length can't be zero. We put carets and dollars here because they can be either metacharacters or literal characters; determining which they are is indeed possible but an extra chore -- so we always count them as literal characters (which take more space than metacharacters). */ case '^': case '$': NORMAL_CHAR: default: length += 2; runlength = 0; do { /* Backslash may introduce a data char or a metacharacter; stop the string before the latter. */ if (c == '\\') { const uschar *saveptr = ptr; c = check_escape (&ptr, errorptr, bracount, options, FALSE, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if (c < 0) { ptr = saveptr - 1; c = '\\'; break; } } /* Ordinary character or single-char escape */ runlength++; c = 0; } /* This "while" is the end of the "do" above. */ while (runlength < MAXLIT && ptr <= compile_block.end && (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0); if (compile_block.ctypes[c] & ctype_meta) ptr--; length += runlength; continue; } } length += 4; /* For final KET and END */ if (length > 65539) { *errorptr = pcre_estrings[20]; return NULL; } /* Compute the size of data block needed and get it, either from malloc or externally provided function. We specify "code[0]" in the offsetof() expression rather than just "code", because it has been reported that one broken compiler fails on "code" because it is also an independent variable. It should make no difference to the value of the offsetof(). */ size = length + offsetof (pcre, code[0]); re = (pcre *) (pcre_malloc) (size); if (re == NULL) { *errorptr = pcre_estrings[21]; return NULL; } /* Put in the magic number, and save the size, options, and table pointer */ re->magic_number = MAGIC_NUMBER; re->size = size; re->options = options; re->tables = tables; /* Set up a starting, non-capturing bracket, then compile the expression. On error, *errorptr will be set non-NULL, so we don't need to look at the result of the function here. */ ptr = (const uschar *) pattern; code = re->code; *code = OP_BRA; bracount = 0; (void) compile_regex (options, -1, &bracount, &code, &ptr, errorptr, FALSE, 0, &reqchar, &countlits, &compile_block, compile_branch_posix); re->top_bracket = bracount; re->top_backref = top_backref; /* If not reached end of pattern on success, there's an excess bracket. */ if (*errorptr == NULL && ptr <= compile_block.end) *errorptr = pcre_estrings[22]; /* Fill in the terminating state and check for disastrous overflow, but if debugging, leave the test till after things are printed out. */ *code++ = OP_END; #ifndef DEBUG if (code - re->code > length) *errorptr = pcre_estrings[23]; #endif /* Give an error if there's back reference to a non-existent capturing subpattern. */ if (top_backref > re->top_bracket) *errorptr = pcre_estrings[15]; /* Failed to compile */ if (*errorptr != NULL) { (pcre_free) (re); PCRE_ERROR_RETURN: *erroroffset = ptr - (const uschar *) pattern; return NULL; } /* If the anchored option was not passed, set flag if we can determine that the pattern is anchored by virtue of ^ characters or \A or anything else (such as starting with .* when DOTALL is set). Otherwise, see if we can determine what the first character has to be, because that speeds up unanchored matches no end. If not, see if we can set the PCRE_STARTLINE flag. This is helpful for multiline matches when all branches start with ^. and also when all branches start with .* for non-DOTALL matches. */ if ((options & PCRE_ANCHORED) == 0) { int temp_options = options; if (is_anchored (re->code, &temp_options)) re->options |= PCRE_ANCHORED; else { int ch = find_firstchar (re->code, &temp_options); if (ch >= 0) { re->first_char = ch; re->options |= PCRE_FIRSTSET; } else if (is_startline (re->code)) re->options |= PCRE_STARTLINE; } } /* If we cannot determine the maximum match size or it is useless, set the field to -1 */ if (compile_block.max_match_size < 0 || !is_endline(re->code)) re->max_match_size = -1; else re->max_match_size = compile_block.max_match_size; /* Save the last required character if there are at least two literal characters on all paths, or if there is no first character setting. */ if (reqchar >= 0 && (countlits > 1 || (re->options & PCRE_FIRSTSET) == 0)) { re->req_char = reqchar; re->options |= PCRE_REQCHSET; } /* Print out the compiled data for debugging */ #ifdef DEBUG pcre_debug (re); if (code - re->code > length) { *errorptr = pcre_estrings[23]; (pcre_free) (re); *erroroffset = ptr - (uschar *) pattern; return NULL; } #endif if (*errorptr && (options & PCRE_ENGLISH_ERRORS) == 0) *errorptr = gettext (*errorptr); return (pcre *) re; } sed-3.62/pcre/regstudy.c0000644000076600007660000010107210143133571012116 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* Include the internals header, which itself includes Standard C headers plus the external pcre header. */ #include "internal.h" uschar pruned[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, OP_ONCESTAR, OP_ONCESTAR, OP_ONCESTAR, OP_ONCEPLUS, OP_ONCEPLUS, OP_ONCEPLUS, OP_ONCEQUERY, OP_ONCEQUERY, OP_ONCEQUERY, OP_ONCEUPTO, OP_ONCEUPTO, OP_ONCEUPTO, 0, 0, OP_NOT_ONCESTAR, OP_NOT_ONCESTAR, OP_NOT_ONCESTAR, OP_NOT_ONCEPLUS, OP_NOT_ONCEPLUS, OP_NOT_ONCEPLUS, OP_NOT_ONCEQUERY, OP_NOT_ONCEQUERY, OP_NOT_ONCEQUERY, OP_NOT_ONCEUPTO, OP_NOT_ONCEUPTO, OP_NOT_ONCEUPTO, 0, 0, OP_TYPE_ONCESTAR, OP_TYPE_ONCESTAR, OP_TYPE_ONCESTAR, OP_TYPE_ONCEPLUS, OP_TYPE_ONCEPLUS, OP_TYPE_ONCEPLUS, OP_TYPE_ONCEQUERY, OP_TYPE_ONCEQUERY, OP_TYPE_ONCEQUERY, OP_TYPE_ONCEUPTO, OP_TYPE_ONCEUPTO, OP_TYPE_ONCEUPTO, 0, 0, OP_TYPENOT_ONCESTAR, OP_TYPENOT_ONCESTAR, OP_TYPENOT_ONCESTAR, OP_TYPENOT_ONCEPLUS, OP_TYPENOT_ONCEPLUS, OP_TYPENOT_ONCEPLUS, OP_TYPENOT_ONCEQUERY, OP_TYPENOT_ONCEQUERY, OP_TYPENOT_ONCEQUERY, OP_TYPENOT_ONCEUPTO, OP_TYPENOT_ONCEUPTO, OP_TYPENOT_ONCEUPTO, 0, 0, OP_CL_ONCESTAR, OP_CL_ONCESTAR, OP_CL_ONCESTAR, OP_CL_ONCEPLUS, OP_CL_ONCEPLUS, OP_CL_ONCEPLUS, OP_CL_ONCEQUERY, OP_CL_ONCEQUERY, OP_CL_ONCEQUERY, OP_CL_ONCERANGE, OP_CL_ONCERANGE, OP_CL_ONCERANGE, 0, OP_REF_ONCESTAR, OP_REF_ONCESTAR, OP_REF_ONCESTAR, OP_REF_ONCEPLUS, OP_REF_ONCEPLUS, OP_REF_ONCEPLUS, OP_REF_ONCEQUERY, OP_REF_ONCEQUERY, OP_REF_ONCEQUERY, OP_REF_ONCERANGE, OP_REF_ONCERANGE, OP_REF_ONCERANGE, 0, 0, 0, OP_KET_ONCESTAR, OP_KET_ONCESTAR, OP_KET_ONCESTAR }; /************************************************* * Set an entry and maybe its alternate case * *************************************************/ /* Given a character, set its bit in the table, and also the bit for the other version of a letter if we are caseless. Arguments: bmtable points to the Boyer-Moore table c is the character length the value of the entry. caseless the caseless flag cd the block with char table pointers Returns: nothing */ static void set_bmtable (bmtable, c, length, caseless, cd) uschar *bmtable; int c; int length; BOOL caseless; compile_data *cd; { bmtable[c] = length; if (caseless && (cd->ctypes[c] & ctype_letter) != 0) { bmtable[cd->fcc[c]] = length; } } /************************************************* * Set a bit and maybe its alternate case * *************************************************/ /* Given a character, set its bit in the table, and also the bit for the other version of a letter if we are caseless. Arguments: bmtable points to the bit map c is the character caseless the caseless flag cd the block with char table pointers Returns: nothing */ static void set_bit (start_bits, c, caseless, cd) uschar *start_bits; int c; BOOL caseless; compile_data *cd; { start_bits[c / 8] |= (1 << (c & 7)); if (caseless && (cd->ctypes[c] & ctype_letter) != 0) start_bits[cd->fcc[c] / 8] |= (1 << (cd->fcc[c] & 7)); } /************************************************* * Create map of starting string * *************************************************/ /* This function scans a compiled unanchored expression and attempts to build a map of the characters occurring in an initial fixed-length string. It returns the length of the string it finds. Arguments: code points to an expression bmtable points to a 256-byte table, initialized to 0 length base value to be given to the table caseless the current state of the caseless flag cd the block with char table pointers Returns: TRUE if table built, FALSE otherwise */ static int set_boyer_moore (code, bmtable, length, caseless, cd) const uschar *code; uschar *bmtable; int length; BOOL caseless; compile_data *cd; { const uschar *tcode = code + 3; BOOL try_next = TRUE; /* If the branch has more than one alternative, it's too complicated, so exit. */ if (code[(code[1] << 8) + code[2]] == OP_ALT) return length; do { int i; switch (*tcode) { default: /* If a branch starts with a bracket, recurse to set the string from within them. That's all for this branch. */ if ((int) *tcode >= OP_BRA) length = set_boyer_moore (tcode, bmtable, length, caseless, cd); return length; /* Skip over extended extraction bracket number */ case OP_BRANUMBER: tcode += 3; break; /* Skip over lookbehind assertions */ case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT); tcode += 3; break; /* Skip over an option setting, changing the caseless flag */ case OP_OPT: caseless = (tcode[1] & PCRE_CASELESS) != 0; tcode += 2; break; /* BRAZERO does the bracket, but carries on. */ case OP_BRAZERO: case OP_BRAMINZERO: try_next = FALSE; break; /* Single-char * ? upto stops the search */ case OP_MAXPLUS: case OP_MINPLUS: case OP_ONCEPLUS: set_bmtable (bmtable, tcode[1], ++length, caseless, cd); case OP_MAXSTAR: case OP_MINSTAR: case OP_ONCESTAR: case OP_MAXQUERY: case OP_MINQUERY: case OP_ONCEQUERY: case OP_MAXUPTO: case OP_MINUPTO: case OP_ONCEUPTO: try_next = FALSE; break; /* At least one single char sets the bit and stops */ case OP_EXACT: length += (tcode[1] << 8) + tcode[2]; if (length > 255) length = 255; set_bmtable (bmtable, tcode[3], length, caseless, cd); tcode += 4; break; case OP_CHARS: { int nchars = tcode[1]; if (nchars > 255 - length) nchars = 255 - length; tcode += 2; while (nchars--) set_bmtable (bmtable, *tcode++, ++length, caseless, cd); } break; /* Single character type sets the bits and stops */ case OP_TYPENOT: tcode++; REPEATTYPENOT: length++; for (i = 0; i < 255; i++) if (!*tcode || !(cd->ctypes[i] & (1 << *tcode))) set_bmtable (bmtable, i, length, caseless, cd); break; case OP_TYPE: tcode++; REPEATTYPE: length++; for (i = 0; i < 255; i++) if (cd->ctypes[i] & (*tcode ? 1 << *tcode : 0)) set_bmtable (bmtable, i, length, caseless, cd); break; /* One or more character type fudges the pointer and restarts, knowing it will hit a single character. */ case OP_TYPE_MAXPLUS: case OP_TYPE_MINPLUS: case OP_TYPE_ONCEPLUS: tcode++; try_next = FALSE; goto REPEATTYPE; case OP_TYPEEXACT: tcode += 3; length += (tcode[1] << 8) + tcode[2] - 1; if (length > 255) length = 255; goto REPEATTYPE; case OP_TYPENOT_MAXPLUS: case OP_TYPENOT_MINPLUS: case OP_TYPENOT_ONCEPLUS: tcode++; try_next = FALSE; goto REPEATTYPENOT; case OP_TYPENOTEXACT: tcode += 3; length += (tcode[1] << 8) + tcode[2] - 1; if (length > 255) length = 255; goto REPEATTYPENOT; /* Zero or more repeats of character types stop here. */ case OP_TYPE_MAXUPTO: case OP_TYPE_MINUPTO: case OP_TYPE_ONCEUPTO: case OP_TYPE_MAXSTAR: case OP_TYPE_MINSTAR: case OP_TYPE_ONCESTAR: case OP_TYPE_MAXQUERY: case OP_TYPE_MINQUERY: case OP_TYPE_ONCEQUERY: case OP_TYPENOT_MAXUPTO: case OP_TYPENOT_MINUPTO: case OP_TYPENOT_ONCEUPTO: case OP_TYPENOT_MAXSTAR: case OP_TYPENOT_MINSTAR: case OP_TYPENOT_ONCESTAR: case OP_TYPENOT_MAXQUERY: case OP_TYPENOT_MINQUERY: case OP_TYPENOT_ONCEQUERY: try_next = FALSE; break; /* Character class: set the bits and either carry on or not, according to the repeat count. */ case OP_CLASS: case OP_CL_MAXRANGE: case OP_CL_MINRANGE: case OP_CL_ONCERANGE: case OP_CL_MAXSTAR: case OP_CL_MINSTAR: case OP_CL_ONCESTAR: case OP_CL_MAXPLUS: case OP_CL_MINPLUS: case OP_CL_ONCEPLUS: case OP_CL_MAXQUERY: case OP_CL_MINQUERY: case OP_CL_ONCEQUERY: { const uschar *classptr = tcode + 1; tcode++; switch (tcode[-1]) { case OP_CL_MAXSTAR: case OP_CL_MINSTAR: case OP_CL_ONCESTAR: case OP_CL_MAXQUERY: case OP_CL_MINQUERY: case OP_CL_ONCEQUERY: try_next = FALSE; break; case OP_CL_MAXRANGE: case OP_CL_MINRANGE: case OP_CL_ONCERANGE: try_next = FALSE; if (((tcode[0] << 8) + tcode[1]) == 0) break; /* There is a minimum length, fall through */ length += (tcode[0] << 8) + tcode[1] - 1; if (length > 255) length = 255; tcode += 4; case OP_CL_MAXPLUS: case OP_CL_MINPLUS: case OP_CL_ONCEPLUS: try_next = FALSE; default: length++; for (i = 0; i < 255; i++) if (classptr[i >> 3] & (1 << (i & 7))) set_bmtable (bmtable, i, length, caseless, cd); break; } tcode += 32; break; /* End of class handling */ } } /* End of switch */ } /* End of try_next loop */ while (try_next && length < 255); return length; } /************************************************* * Create map of starting chars * *************************************************/ /* This function scans a compiled unanchored expression and attempts to build a map of the characters occurring at the start of the match. If it can't, it returns FALSE. As time goes by, we may be able to get more clever at doing this. Arguments: code points to an expression start_bits points to a 32-byte table, initialized to 0 caseless the current state of the caseless flag cd the block with char table pointers Returns: TRUE if table built, FALSE otherwise */ static BOOL set_start_bits (code, start_bits, caseless, cd) const uschar *code; uschar *start_bits; BOOL caseless; compile_data *cd; { int i; /* This next statement and the later reference to dummy are here in order to trick the optimizer of the IBM C compiler for OS/2 into generating correct code. Apparently IBM isn't going to fix the problem, and we would rather not disable optimization (in this module it actually makes a big difference, and the pcre module can use all the optimization it can get). */ volatile int dummy; do { const uschar *tcode = code + 3; BOOL try_next = TRUE; do { /* If a branch starts with a bracket or a positive lookahead assertion, recurse to set bits from within them. That's all for this branch. */ if ((int) *tcode >= OP_BRA || *tcode == OP_ASSERT) { if (!set_start_bits (tcode, start_bits, caseless, cd)) return FALSE; break; } switch (*tcode) { default: if ((int) *tcode >= OP_BRA || *tcode == OP_ASSERT) abort (); else return FALSE; /* Skip over extended extraction bracket number */ case OP_BRANUMBER: tcode += 3; break; /* Skip over lookbehind and negative lookahead assertions */ case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT); tcode += 3; break; /* Skip over an option setting, changing the caseless flag */ case OP_OPT: caseless = (tcode[1] & PCRE_CASELESS) != 0; tcode += 2; break; /* BRAZERO does the bracket, but carries on. */ case OP_BRAZERO: case OP_BRAMINZERO: if (!set_start_bits (++tcode, start_bits, caseless, cd)) return FALSE; dummy = 1; do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT); tcode += 3; break; /* Single-char * or ? sets the bit and tries the next item */ case OP_MAXSTAR: case OP_MINSTAR: case OP_ONCESTAR: case OP_MAXQUERY: case OP_MINQUERY: case OP_ONCEQUERY: set_bit (start_bits, tcode[1], caseless, cd); tcode += 2; break; /* Single-char upto sets the bit and tries the next */ case OP_MAXUPTO: case OP_MINUPTO: case OP_ONCEUPTO: set_bit (start_bits, tcode[3], caseless, cd); tcode += 4; break; /* At least one single char sets the bit and stops */ case OP_EXACT: /* Fall through */ tcode++; case OP_CHARS: /* Fall through */ tcode++; case OP_MAXPLUS: case OP_MINPLUS: case OP_ONCEPLUS: set_bit (start_bits, tcode[1], caseless, cd); try_next = FALSE; break; /* Single character type sets the bits and stops */ case OP_TYPENOT: tcode++; try_next = FALSE; REPEATTYPENOT: if (!*tcode) return FALSE; for (i = 0; i < 32; i++) start_bits[i] |= ~cd->cbits[i + *tcode * 32]; break; case OP_TYPE: tcode++; try_next = FALSE; REPEATTYPE: if (!*tcode) return FALSE; for (i = 0; i < 32; i++) start_bits[i] |= cd->cbits[i + *tcode * 32]; break; /* One or more character type fudges the pointer and restarts. */ case OP_TYPEEXACT: tcode += 2; case OP_TYPE_MAXPLUS: case OP_TYPE_MINPLUS: case OP_TYPE_ONCEPLUS: tcode++; try_next = FALSE; goto REPEATTYPE; /* Zero or more repeats of character types set the bits and then try again. */ case OP_TYPE_MAXUPTO: case OP_TYPE_MINUPTO: case OP_TYPE_ONCEUPTO: tcode += 2; /* Fall through */ case OP_TYPE_MAXSTAR: case OP_TYPE_MINSTAR: case OP_TYPE_ONCESTAR: case OP_TYPE_MAXQUERY: case OP_TYPE_MINQUERY: case OP_TYPE_ONCEQUERY: tcode++; goto REPEATTYPE; break; /* One or more character type fudges the pointer and restarts. */ case OP_TYPENOTEXACT: tcode += 2; /* Fall through */ case OP_TYPENOT_MAXPLUS: case OP_TYPENOT_MINPLUS: case OP_TYPENOT_ONCEPLUS: try_next = FALSE; goto REPEATTYPENOT; case OP_TYPENOT_MAXUPTO: case OP_TYPENOT_MINUPTO: case OP_TYPENOT_ONCEUPTO: tcode += 2; /* Fall through */ case OP_TYPENOT_MAXSTAR: case OP_TYPENOT_MINSTAR: case OP_TYPENOT_ONCESTAR: case OP_TYPENOT_MAXQUERY: case OP_TYPENOT_MINQUERY: case OP_TYPENOT_ONCEQUERY: tcode++; goto REPEATTYPENOT; /* Character class: set the bits and either carry on or not, according to the repeat count. */ case OP_CLASS: case OP_CL_MAXSTAR: case OP_CL_MINSTAR: case OP_CL_ONCESTAR: case OP_CL_MAXPLUS: case OP_CL_MINPLUS: case OP_CL_ONCEPLUS: case OP_CL_MAXQUERY: case OP_CL_MINQUERY: case OP_CL_ONCEQUERY: case OP_CL_MAXRANGE: case OP_CL_MINRANGE: case OP_CL_ONCERANGE: { tcode++; for (i = 0; i < 32; i++) start_bits[i] |= tcode[i]; tcode += 32; switch (tcode[-33]) { case OP_CL_MAXSTAR: case OP_CL_MINSTAR: case OP_CL_ONCESTAR: case OP_CL_MAXQUERY: case OP_CL_MINQUERY: case OP_CL_ONCEQUERY: break; case OP_CL_MAXRANGE: case OP_CL_MINRANGE: case OP_CL_ONCERANGE: if (((tcode[1] << 8) + tcode[2]) == 0) tcode += 4; else try_next = FALSE; break; } } break; /* End of class handling */ } /* End of switch */ } /* End of try_next loop */ while (try_next); code += (code[1] << 8) + code[2]; /* Advance to next branch */ } while (*code == OP_ALT); return TRUE; } /************************************************* * Prune paths from a bracket * *************************************************/ /* This function is handed a pointer to the opcodes for a bracket in which it must prune impossible backtracking paths. This is done by replacing _MAX* and _MIN* opcodes by the corresponding _ONCE* opcodes. Arguments: codeptr points to the first opcode we're interested in, on output it is rewritten with the end of the bracket bracket_start points to an array of bitsets that contain the possible starting characters of the capturing subpatterns bracket_end points to an array of bitsets that contain the possible ending characters of the capturing subpatterns caseless the caseless flag cd the block with char table pointers p_start points to where the function will store the character class starting the bracket p_end points to where the function will store the character class for the end, and will get the character class for the character immediately preceding the bracket */ BOOL prune_bracket (codeptr, bracket_start, bracket_end, caseless, cd, p_start, p_end) uschar **codeptr; BOOL caseless; bitset *bracket_start, *bracket_end, *p_start, *p_end; compile_data *cd; { bitset all_alternatives_start, all_alternatives_end; bitset prev_class, curr_class, start, end; uschar *previous, *code = *codeptr; BOOL is_final_opcode, found_start, end_same_as_start; BOOL can_be_empty, bracket_can_be_empty = FALSE; /* Skip over the assertion at the beginning of a conditional */ if (*code == OP_COND && code[3] == OP_ASSERT) code += (code[4] << 8) | code[5]; code += 3; memset (all_alternatives_start, 0, 32); memset (all_alternatives_end, 0, 32); restart: if (p_end) memcpy (curr_class, p_end, 32); else memset (curr_class, 0, 32); memset (start, 0, 32); memset (end, ~0, 32); previous = NULL; found_start = FALSE; for (;;) { int i, backref; uschar *current = code; memcpy (prev_class, curr_class, 32); memset (curr_class, 0, 32); can_be_empty = TRUE; end_same_as_start = TRUE; is_final_opcode = FALSE; switch (*code) { /* Skip over informational opcodes */ case OP_REVERSE: case OP_CREF: case OP_BRANUMBER: code += 3; break; case OP_END: case OP_KET: case OP_KET_MINSTAR: case OP_KET_MAXSTAR: case OP_KET_ONCESTAR: is_final_opcode = TRUE; case OP_ALT: code += 3; for (i = 0; i < 32; i++) { all_alternatives_start[i] |= start[i]; all_alternatives_end[i] |= end[i]; } if (!found_start) { bracket_can_be_empty = TRUE; memset (all_alternatives_start, ~0, 32); if (p_end) for (i = 0; i < 32; i++) all_alternatives_end[i] |= (*p_end)[i]; else memset (all_alternatives_end, ~0, 32); } if (is_final_opcode) { if (p_start) memcpy (p_start, all_alternatives_start, 32); if (p_end) memcpy (p_end, all_alternatives_end, 32); *codeptr = code; return bracket_can_be_empty; } else goto restart; /* Skip over things that don't match chars */ case OP_DOLL: case OP_EODN: end_same_as_start = FALSE; memcpy (end, prev_class, 32); memset (curr_class, ~0, 32); curr_class[13 / 8] ^= 1 << (13 % 8); case OP_ANCHOR_MATCH: case OP_SOD: case OP_CIRC: case OP_EOD: code++; break; case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: end_same_as_start = FALSE; memcpy (end, prev_class, 32); memset (curr_class, ~0, 32); code++; break; case OP_BEG_WORD: for (i = 0; i < 32; i++) curr_class[i] = cd->cbits[i + cbit_word]; code++; break; case OP_END_WORD: for (i = 0; i < 32; i++) curr_class[i] = ~cd->cbits[i + cbit_word]; code++; break; /* Skip over lookbehind and negative lookahead assertions */ case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do code += (code[1] << 8) + code[2]; while (*code == OP_ALT); memset (curr_class, ~0, 32); code += 3; break; case OP_ASSERT: prune_bracket (&code, bracket_start, bracket_end, caseless, cd, &curr_class, &end); memcpy (end, prev_class, 32); end_same_as_start = FALSE; break; case OP_ASSERT_NOT: do code += (code[1] << 8) + code[2]; while (*code == OP_ALT); code += 3; memset (curr_class, ~0, 32); break; /* Skip over an option setting, changing the caseless flag */ case OP_OPT: caseless = (code[1] & PCRE_CASELESS) != 0; /* FIXME m and s too */ code += 2; break; /* BRAZERO does the bracket, but can be empty the classes. */ case OP_BRAZERO: case OP_BRAMINZERO: code++; prune_bracket (&code, bracket_start, bracket_end, caseless, cd, &curr_class, &end); end_same_as_start = FALSE; memset (curr_class, ~0, 32); for (i = 0; i < 32; i++) end[i] |= prev_class[i]; break; /* Single character type sets the bits */ case OP_TYPENOT: code++; can_be_empty = FALSE; REPEATTYPENOT: if (!*code) memset (curr_class, ~0, 32); else for (i = 0; i < 32; i++) curr_class[i] = ~cd->cbits[i + *code * 32]; code++; break; case OP_TYPE: code++; can_be_empty = FALSE; REPEATTYPE: if (!*code) memset (curr_class, ~0, 32); else for (i = 0; i < 32; i++) curr_class[i] = cd->cbits[i + *code * 32]; code++; break; case OP_CHARS: code++; can_be_empty = FALSE; end_same_as_start = FALSE; set_bit (curr_class, code[1], caseless, cd); code += 1 + (int) *code; memset (end, 0, 32); set_bit (end, code[-1], caseless, cd); break; case OP_ANY: code++; can_be_empty = FALSE; memset (curr_class, ~0, 32); break; case OP_NOT: code++; can_be_empty = FALSE; REPEATNOT: set_bit (curr_class, *code++, caseless, cd); for (i = 0; i < 32; i++) curr_class[i] = ~curr_class[i]; break; /* One or more character type fudges the pointer and restarts. */ case OP_TYPEEXACT: code += 2; case OP_TYPE_MAXPLUS: case OP_TYPE_MINPLUS: case OP_TYPE_ONCEPLUS: code++; can_be_empty = FALSE; goto REPEATTYPE; /* Zero or more repeats of character types set the bits and then try again. */ case OP_TYPE_MAXUPTO: case OP_TYPE_MINUPTO: case OP_TYPE_ONCEUPTO: code += 2; /* Fall through */ case OP_TYPE_MAXSTAR: case OP_TYPE_MINSTAR: case OP_TYPE_ONCESTAR: case OP_TYPE_MAXQUERY: case OP_TYPE_MINQUERY: case OP_TYPE_ONCEQUERY: code++; goto REPEATTYPE; break; /* One or more character type fudges the pointer and restarts. */ case OP_TYPENOTEXACT: code += 2; /* Fall through */ case OP_TYPENOT_MAXPLUS: case OP_TYPENOT_MINPLUS: case OP_TYPENOT_ONCEPLUS: code++; can_be_empty = FALSE; goto REPEATTYPENOT; case OP_TYPENOT_MAXUPTO: case OP_TYPENOT_MINUPTO: case OP_TYPENOT_ONCEUPTO: code += 2; /* Fall through */ case OP_TYPENOT_MAXSTAR: case OP_TYPENOT_MINSTAR: case OP_TYPENOT_ONCESTAR: case OP_TYPENOT_MAXQUERY: case OP_TYPENOT_MINQUERY: case OP_TYPENOT_ONCEQUERY: code++; goto REPEATTYPENOT; /* One or more character type fudges the pointer and restarts. */ case OP_EXACT: code += 2; case OP_MAXPLUS: case OP_MINPLUS: case OP_ONCEPLUS: code++; can_be_empty = FALSE; goto REPEATCHARS; /* Zero or more repeats of character types set the bits and then try again. */ case OP_MAXUPTO: case OP_MINUPTO: case OP_ONCEUPTO: code += 2; /* Fall through */ case OP_MAXSTAR: case OP_MINSTAR: case OP_ONCESTAR: case OP_MAXQUERY: case OP_MINQUERY: case OP_ONCEQUERY: code++; REPEATCHARS: set_bit (curr_class, *code++, caseless, cd); break; /* One or more character type fudges the pointer and restarts. */ case OP_NOTEXACT: code += 2; /* Fall through */ case OP_NOT_MAXPLUS: case OP_NOT_MINPLUS: case OP_NOT_ONCEPLUS: can_be_empty = FALSE; code++; goto REPEATNOT; case OP_NOT_MAXUPTO: case OP_NOT_MINUPTO: case OP_NOT_ONCEUPTO: code += 2; /* Fall through */ case OP_NOT_MAXSTAR: case OP_NOT_MINSTAR: case OP_NOT_ONCESTAR: case OP_NOT_MAXQUERY: case OP_NOT_MINQUERY: case OP_NOT_ONCEQUERY: code++; goto REPEATNOT; /* Character class: set the bits and either carry on or not, according to the repeat count. */ case OP_CLASS: case OP_CL_MAXSTAR: case OP_CL_MINSTAR: case OP_CL_ONCESTAR: case OP_CL_MAXPLUS: case OP_CL_MINPLUS: case OP_CL_ONCEPLUS: case OP_CL_MAXQUERY: case OP_CL_MINQUERY: case OP_CL_ONCEQUERY: case OP_CL_MAXRANGE: case OP_CL_MINRANGE: case OP_CL_ONCERANGE: { code++; for (i = 0; i < 32; i++) curr_class[i] |= code[i]; code += 32; switch (code[-33]) { case OP_CL_MAXSTAR: case OP_CL_MINSTAR: case OP_CL_ONCESTAR: case OP_CL_MAXQUERY: case OP_CL_MINQUERY: case OP_CL_ONCEQUERY: break; case OP_CL_MAXRANGE: case OP_CL_MINRANGE: case OP_CL_ONCERANGE: if (((code[1] << 8) + code[2]) == 0) code += 4; else can_be_empty = FALSE; break; default: can_be_empty = FALSE; break; } } break; /* End of class handling */ /* Character class: set the bits and either carry on or not, according to the repeat count. */ case OP_REF: case OP_REF_MAXSTAR: case OP_REF_MINSTAR: case OP_REF_ONCESTAR: case OP_REF_MAXPLUS: case OP_REF_MINPLUS: case OP_REF_ONCEPLUS: case OP_REF_MAXQUERY: case OP_REF_MINQUERY: case OP_REF_ONCEQUERY: case OP_REF_MAXRANGE: case OP_REF_MINRANGE: case OP_REF_ONCERANGE: { int number = (code[1] << 8) | code[2]; code += 3; memcpy (curr_class, bracket_start[number], 32); end_same_as_start = FALSE; switch (code[-3]) { case OP_REF_MAXSTAR: case OP_REF_MINSTAR: case OP_REF_ONCESTAR: case OP_REF_MAXQUERY: case OP_REF_MINQUERY: case OP_REF_ONCEQUERY: for (i = 0; i < 32; i++) end[i] = bracket_end[number][i]; break; case OP_REF_MAXRANGE: case OP_REF_MINRANGE: case OP_REF_ONCERANGE: if (((code[1] << 8) + code[2]) == 0) code += 4; case OP_REF_MAXPLUS: case OP_REF_MINPLUS: case OP_REF_ONCEPLUS: memcpy (end, bracket_end[number], 32); } } break; /* End of class handling */ default: if ((int) *code >= OP_BRA) { backref = *code - OP_BRA; if (backref > EXTRACT_BASIC_MAX) backref = (code[4] << 8) | code[5]; } else if (*code == OP_ONCE || *code == OP_COND) backref = 0; else { printf ("What's this `%s'?\n", pcre_OP_names[*code]); abort(); } can_be_empty = prune_bracket(&code, bracket_start, bracket_end, caseless, cd, &curr_class, &end); memcpy (bracket_start[backref], curr_class, 32); memcpy (bracket_end[backref], end, 32); end_same_as_start = FALSE; break; } /* End of switch */ /* Check if we can prune the last path. The check on can_be_empty avoids pruning b* in b*c*b+. */ if (previous && !can_be_empty) { for (i = 0; i < 32; i++) if (curr_class[i] & prev_class[i]) break; if (i == 32) *previous = pruned[*previous]; } if (end_same_as_start) { if (can_be_empty) { int i; for (i = 0; i < 32; i++) end[i] |= curr_class[i]; } else memcpy (end, curr_class, 32); } /* We found the starting class for this bracket (or part of it if there are alternative branches). */ if (!found_start) { found_start = !can_be_empty; for (i = 0; i < 32; i++) start[i] |= curr_class[i]; } previous = (*current < sizeof (pruned) && pruned[*current]) ? current : NULL; } } /************************************************* * Prune paths from a compiled expression * *************************************************/ /* This function is handed a compiled expression of which it must prune impossible backtracking paths. This is done by replacing _MAX* and _MIN* opcodes by the corresponding _ONCE* opcodes. Arguments: re points to the compiled expression caseless the caseless flag cd the block with char table pointers */ void prune_backtracking_paths (re, caseless, cd) const pcre *re; BOOL caseless; compile_data *cd; { uschar *code = re->code; /* The first entry is used as scratch in both bitsets. */ bitset *bracket_start = (bitset *) alloca(sizeof(bitset) * (1 + re->top_bracket)); bitset *bracket_end = (bitset *) alloca(sizeof(bitset) * (1 + re->top_bracket)); prune_bracket (&code, bracket_start, bracket_end, caseless, cd, NULL, NULL); } /************************************************* * Study a compiled expression * *************************************************/ /* This function is handed a compiled expression that it must study to produce information that will speed up the matching. It returns a pcre_extra block which then gets handed back to pcre_exec(). Arguments: re points to the compiled expression options contains option bits errorptr points to where to place error messages; set NULL unless error Returns: pointer to a pcre_extra block, NULL on error or if no optimization possible */ pcre_extra * pcre_study (re, options, errorptr) const pcre *re; int options; const char **errorptr; { pcre_extra *extra, myextra; compile_data compile_block; int length; int caseless; *errorptr = NULL; if (re == NULL || re->magic_number != MAGIC_NUMBER) { *errorptr = "argument is not a compiled regular expression"; return NULL; } if ((options & ~PUBLIC_STUDY_OPTIONS) != 0) { *errorptr = "unknown or incorrect option bit(s) set"; return NULL; } /* Set the character tables in the block which is passed around */ compile_block.lcc = re->tables + lcc_offset; compile_block.fcc = re->tables + fcc_offset; compile_block.cbits = re->tables + cbits_offset; compile_block.ctypes = re->tables + ctypes_offset; caseless = (re->options & PCRE_CASELESS) != 0; if (!(options & PCRE_STUDY_NO_PRUNE)) prune_backtracking_paths(re, caseless, &compile_block); /* For an anchored pattern, or a multiline pattern that matches only at "line starts", no further processing at present. */ if ((re->options & (PCRE_ANCHORED | PCRE_STARTLINE)) != 0 || (options & PCRE_STUDY_NO_START)) return NULL; /* See if we can find a fixed length initial string for the pattern. */ memset ((char *) &myextra, 0, sizeof (myextra)); if ((length = set_boyer_moore (re->code, myextra.data.bmtable, 0, caseless, &compile_block)) > 1) { int i; myextra.options = PCRE_STUDY_BM; for (i = 0; i < 257; i++) myextra.data.bmtable[i] = length - myextra.data.bmtable[i]; } else { if ((re->options & PCRE_FIRSTSET) != 0) return NULL; /* See if we can find a fixed set of initial characters for the pattern. */ memset ((char *) &myextra, 0, sizeof (myextra)); if (set_start_bits (re->code, myextra.data.start_bits, caseless, &compile_block)) myextra.options = PCRE_STUDY_MAPPED; } if (!myextra.options) return NULL; /* Get an "extra" block and put the information therein. */ extra = (pcre_extra *) (pcre_malloc) (sizeof (pcre_extra)); if (extra == NULL) { *errorptr = "failed to get memory"; return NULL; } memcpy ((char *) extra, (char *) &myextra, sizeof (myextra)); return (pcre_extra *) extra; } sed-3.62/pcre/regsub.c0000644000076600007660000001662610143133571011551 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* This module contains some convenience functions for extracting substrings from the subject string after a regex match has succeeded. The original idea for these functions came from Scott Wimer . */ /* Include the internals header, which itself includes Standard C headers plus the external pcre header. */ #include "internal.h" /************************************************* * Copy captured string to given buffer * *************************************************/ /* This function copies a single captured substring into a given buffer. Note that we use memcpy() rather than strncpy() in case there are binary zeros in the string. Arguments: subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) stringnumber the number of the required substring buffer where to put the substring size the size of the buffer Returns: if successful: the length of the copied string, not including the zero that is put on the end; can be zero if not successful: PCRE_ERROR_NOMEMORY (-6) buffer too small PCRE_ERROR_NOSUBSTRING (-7) no such captured substring */ int pcre_copy_substring (subject, ovector, stringcount, stringnumber, buffer, size) const char *subject; int *ovector; int stringcount; int stringnumber; char *buffer; int size; { int yield; if (stringnumber < 0 || stringnumber >= stringcount) return PCRE_ERROR_NOSUBSTRING; stringnumber *= 2; yield = ovector[stringnumber + 1] - ovector[stringnumber]; if (size < yield + 1) return PCRE_ERROR_NOMEMORY; memcpy (buffer, subject + ovector[stringnumber], yield); buffer[yield] = 0; return yield; } /************************************************* * Copy all captured strings to new store * *************************************************/ /* This function gets one chunk of store and builds a list of pointers and all of the captured substrings in it. A NULL pointer is put on the end of the list. Arguments: subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) listptr set to point to the list of pointers Returns: if successful: 0 if not successful: PCRE_ERROR_NOMEMORY (-6) failed to get store */ int pcre_get_substring_list (subject, ovector, stringcount, listptr) const char *subject; int *ovector; int stringcount; const char ***listptr; { int i; int size = sizeof (char *); int double_count = stringcount * 2; char **stringlist; char *p; for (i = 0; i < double_count; i += 2) size += sizeof (char *) + ovector[i + 1] - ovector[i] + 1; stringlist = (char **) (pcre_malloc) (size); if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; *listptr = (const char **) stringlist; p = (char *) (stringlist + stringcount + 1); for (i = 0; i < double_count; i += 2) { int len = ovector[i + 1] - ovector[i]; memcpy (p, subject + ovector[i], len); *stringlist++ = p; p += len; *p++ = 0; } *stringlist = NULL; return 0; } /************************************************* * Free store obtained by get_substring_list * *************************************************/ /* This function exists for the benefit of people calling PCRE from non-C programs that can call its functions, but not free() or (pcre_free)() directly. Argument: the result of a previous pcre_get_substring_list() Returns: nothing */ void pcre_free_substring_list (pointer) const char **pointer; { (pcre_free) ((void *) pointer); } /************************************************* * Copy captured string to new store * *************************************************/ /* This function copies a single captured substring into a piece of new store Arguments: subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) stringnumber the number of the required substring stringptr where to put a pointer to the substring Returns: if successful: the length of the string, not including the zero that is put on the end; can be zero if not successful: PCRE_ERROR_NOMEMORY (-6) failed to get store PCRE_ERROR_NOSUBSTRING (-7) substring not present */ int pcre_get_substring (subject, ovector, stringcount, stringnumber, stringptr) const char *subject; int *ovector; int stringcount; int stringnumber; const char **stringptr; { int yield; char *substring; if (stringnumber < 0 || stringnumber >= stringcount) return PCRE_ERROR_NOSUBSTRING; stringnumber *= 2; yield = ovector[stringnumber + 1] - ovector[stringnumber]; substring = (char *) (pcre_malloc) (yield + 1); if (substring == NULL) return PCRE_ERROR_NOMEMORY; memcpy (substring, subject + ovector[stringnumber], yield); substring[yield] = 0; *stringptr = substring; return yield; } /************************************************* * Free store obtained by get_substring * *************************************************/ /* This function exists for the benefit of people calling PCRE from non-C programs that can call its functions, but not free() or (pcre_free)() directly. Argument: the result of a previous pcre_get_substring() Returns: nothing */ void pcre_free_substring (pointer) const char *pointer; { (pcre_free) ((void *) pointer); } sed-3.62/pcre/regtables.c0000644000076600007660000000773610143133571012234 00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software 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. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- See the file Tech.Notes for some information on the internals. */ #include "internal.h" #if !defined HAVE_ISBLANK && !defined isblank # define isblank(ch) ((ch) == ' ' || (ch) == '\t') #endif /************************************************* * Create PCRE character tables * *************************************************/ /* This function builds a set of character tables for use by PCRE and returns a pointer to them. They are build using the ctype functions, and consequently their contents will depend upon the current locale setting. When compiled as part of the library, the store is obtained via pcre_malloc(). Arguments: none Returns: pointer to the contiguous block of data */ const unsigned char * pcre_maketables () { unsigned char *yield, *p; int i; yield = (unsigned char *) (pcre_malloc) (tables_length); if (yield == NULL) return NULL; p = yield; /* First comes the lower casing table */ for (i = 0; i < 256; i++) *p++ = tolower (i); /* Next the case-flipping table */ for (i = 0; i < 256; i++) *p++ = islower (i) ? toupper (i) : tolower (i); /* Then the character class tables. Don't try to be clever and save effort on exclusive ones - in some locales things may be different. */ memset (p, 0, cbit_length); for (i = 0; i < 256; i++) { if (isdigit (i)) { p[cbit_digit + i / 8] |= 1 << (i & 7); p[cbit_word + i / 8] |= 1 << (i & 7); } if (isupper (i)) { p[cbit_upper + i / 8] |= 1 << (i & 7); p[cbit_word + i / 8] |= 1 << (i & 7); } if (islower (i)) { p[cbit_lower + i / 8] |= 1 << (i & 7); p[cbit_word + i / 8] |= 1 << (i & 7); } if (i == '_') p[cbit_word + i / 8] |= 1 << (i & 7); if (isspace (i)) p[cbit_space + i / 8] |= 1 << (i & 7); if (isxdigit (i)) p[cbit_xdigit + i / 8] |= 1 << (i & 7); if (isgraph (i)) p[cbit_graph + i / 8] |= 1 << (i & 7); if (isprint (i)) p[cbit_print + i / 8] |= 1 << (i & 7); if (ispunct (i)) p[cbit_punct + i / 8] |= 1 << (i & 7); if (iscntrl (i)) p[cbit_cntrl + i / 8] |= 1 << (i & 7); if (isblank (i)) p[cbit_blank + i / 8] |= 1 << (i & 7); } p += cbit_length; /* Finally, the character type table */ for (i = 0; i < 256; i++) { int x = 0; if (isspace (i)) x += ctype_space; if (isalpha (i)) x += ctype_letter; if (isdigit (i)) x += ctype_digit; if (isxdigit (i)) x += ctype_xdigit; if (isalnum (i) || i == '_') x += ctype_word; if (i && strchr ("*+?{^.$|()[", i) != 0) x += ctype_meta; if (i == '\n') x += ctype_newline; *p++ = x; } return yield; } sed-3.62/po/0000777000076600007660000000000010202633244007652 500000000000000sed-3.62/po/ChangeLog0000644000076600007660000000243510144674126011355 000000000000002004-11-11 Paolo Bonzini * Makevars: New. 2004-11-02 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-26 Paolo Bonzini * po/*.po: updated from Translation Project 2001-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. 2001-03-02 Paolo Bonzini * po/it.po: updated * po/sed.pot: likewise. 2000-12-10 Paolo Bonzini * po/it.po: Italian translation reviewed for new POT file. * po/sed.pot: updated Mon Mar 15 16:25:53 PST 1999 Ken Pizzini * po/it.po: new translation file. Sun Feb 7 21:22:17 PST 1999 Ken Pizzini * po/de.po: new translation file. Sat Dec 12 11:18:55 PST 1998 Ken Pizzini * po/ru.po: new translation file. Sun Dec 6 00:51:23 PST 1998 Ken Pizzini * po/fr.po: new translation file. Sun Aug 16 02:59:20 PDT 1998 Ken Pizzini * sed/compile.c: added N_() markers and corresponding gettext() (er, _()) calls. * po/sed.pot: updated to reflect changed and newly marked text. 1998-07-24 Erick Branderhorst * po/nl.po: Dutch translation. sed-3.62/po/LINGUAS0000644000076600007660000000014310144212760010612 00000000000000af ca cs da de el eo es et fi fr ga gl he hr hu id it ja ko nl pl pt_BR ro ru sk sl sr sv tr zh_CN sed-3.62/po/Makefile.in.in0000644000076600007660000002304510143704210012240 00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2002 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ localedir = $(datadir)/locale gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @MKINSTALLDIRS@ mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac` GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in Makevars \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) POTFILES.in $(DOMAIN).pot \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .nop .po-update .po.mo: $(MSGFMT) -c -o $@ $< .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ && test ! -f $(DOMAIN).po \ || ( rm -f $(srcdir)/$(DOMAIN).pot \ && mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot ) $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common); do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkinstalldirs) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkinstalldirs) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkinstalldirs) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkinstalldirs) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext"; then \ for file in $(DISTFILES.common); do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all dvi info tags TAGS ID: mostlyclean: rm -f core core.* $(DOMAIN).po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: $(DISTFILES) dists="$(DISTFILES)"; \ if test -f $(srcdir)/ChangeLog; then dists="$$dists ChangeLog"; fi; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir); \ else \ cp -p $(srcdir)/$$file $(distdir); \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ $(SHELL) ./config.status force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: sed-3.62/po/Makevars0000644000076600007660000000341610144674126011277 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Free Software Foundation, Inc. # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = sed-3.62/po/POTFILES.in0000644000076600007660000000017510143133571011350 00000000000000pcre/internal.h pcre/pcregrep.c pcre/regexp.c pcre/regstudy.c sed/compile.c sed/execute.c sed/regexp.c sed/sed.c lib/utils.c sed-3.62/po/Rules-quot0000644000076600007660000000323110143704210011564 00000000000000# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header sed-3.62/po/af.gmo0000644000076600007660000000524510176462003010671 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^stRè¿;*û&C]`uÖ&ë H , u ‡) ¥) Ï+ ù3 %! Y { Ž     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.9 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-01-11 21:06+0000 Last-Translator: Ysbeer Language-Team: Afrikaans MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=n!=1; -R, --regexp-perl gebruik Perl 5 se regexsintaks in die skrip. %s Hierdie is vrye sagteware; raadpleeg die bronkode vir kopiëringsinligting. Daar is GEEN waarborg nie; nie eens vir BRUIKBAARHEID of GESKIKHEID VIR 'n SPESIFIEK DOEL, binne regsperke nie. %s: -e uitdrukking #%lu, karakter %lu: %s %s: Kan nie %s lees nie: %s %s: lêer %s lyn %lu: %s : soek nie 'n adres nieRapporteer foute per e-pos aan: %s . Sluit asb. die woord ``%s'' êrens in die onderwerplyn in. GNU sed weergawe %s `e' instruksie word nie ondersteun nie`}' soek nie 'n adres niekon nie %d item na %s skryf nie: %skon nie %d items na %s skryf nie: %sfout in subproseshet nuwer sed-weergawe verwagmeervoudige `g' opsies vir `s' instruksiemeervoudige `p' opsies vir `s' instruksiemeervoudige nommeropsies vir `s' instruksienommeropsie vir `s' instruksie mag nie nul wees nieopsie `e' word nie ondersteun nieleesfout op %s: %ssuper-sed weergawe %s sed-3.62/po/af.po0000644000076600007660000003250010176462000010514 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) 2004 Free Software Foundation, Inc. # This file is distributed under the same license as the sed package. # Ysbeer , 2004 # msgid "" msgstr "" "Project-Id-Version: sed 4.0.9\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-01-11 21:06+0000\n" "Last-Translator: Ysbeer \n" "Language-Team: Afrikaans \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=n!=1;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Onbekende opsie vir `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "leesfout op %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Ongeldige karakterklasnaam" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Ongepaarde `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Onbekende opsie vir `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Vermiste instruksie" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Regex te groot" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "opsie `e' word nie ondersteun nie" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Ongeldige inhoud binne \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Meervoudige `!'s" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Onverwagte `,'" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Kan nie +N or ~N as die eerste adres gebruik nie" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Ongepaarde `{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Onverwagte `}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Ekstra karakters na instruksie" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Het \\ na `a', `c' or `i' verwag" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' soek nie 'n adres nie" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": soek nie 'n adres nie" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Kommentare aanvaar nie adresse nie" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Vermiste instruksie" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Instruksie gebruik slegs een adres" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Ongetermineerde adresregex" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Ongetermineerde `s' instruksie" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Ongetermineerde `y' instruksie" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Onbekende opsie vir `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "meervoudige `p' opsies vir `s' instruksie" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "meervoudige `g' opsies vir `s' instruksie" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "meervoudige nommeropsies vir `s' instruksie" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "nommeropsie vir `s' instruksie mag nie nul wees nie" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "stringe vir y-instruksie het verskillende lengtes" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "het nuwer sed-weergawe verwag" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Instruksie gebruik slegs een adres" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Onbekende instruksie:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: lêer %s lyn %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e uitdrukking #%lu, karakter %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Kan nie etiket vir sprong na `%s' kry nie" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: Kan nie %s lees nie: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Kon nie die lêer %s oopmaak nie: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Kon nie tydelike lêer %s oopmaak nie: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "fout in subproses" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "opsie `e' word nie ondersteun nie" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "`e' instruksie word nie ondersteun nie" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Geen vorige regex nie" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Kan nie veranderaars vir leë regex spesifiseer nie" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Ongeldige regterhandsverwysing \\%d vir `s' instruksie" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " gebruik Perl 5 se regexsintaks in die skrip.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " gebruik Perl 5 se regexsintaks in die skrip.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Rapporteer foute per e-pos aan: %s .\n" "Sluit asb. die woord ``%s'' êrens in die onderwerplyn in.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed weergawe %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "gebaseer op GNU sed weergawe 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed weergawe %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Hierdie is vrye sagteware; raadpleeg die bronkode vir kopiëringsinligting. " "Daar is GEEN\n" "waarborg nie; nie eens vir BRUIKBAARHEID of GESKIKHEID VIR 'n SPESIFIEK " "DOEL,\n" "binne regsperke nie.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: Kan nie %s lees nie: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Kon nie die lêer %s oopmaak nie: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "kon nie %d item na %s skryf nie: %s" msgstr[1] "kon nie %d items na %s skryf nie: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "leesfout op %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: Kan nie %s lees nie: %s\n" #~ msgid "Success" #~ msgstr "Sukses" #~ msgid "No match" #~ msgstr "Geen paring" #~ msgid "Invalid regular expression" #~ msgstr "Ongeldige regex" #~ msgid "Invalid collation character" #~ msgstr "Ongeldige kollasiekarakter" #~ msgid "Trailing backslash" #~ msgstr "Sleep terugstreep" #~ msgid "Invalid back reference" #~ msgstr "Ongeldige terugverwysing" #~ msgid "Unmatched [ or [^" #~ msgstr "Ongepaarde [ of [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "Ongepaarde ( or \\(" #~ msgid "Unmatched \\{" #~ msgstr "Ongepaarde \\{" #~ msgid "Invalid range end" #~ msgstr "Ongeldige bereikseinde" #~ msgid "Memory exhausted" #~ msgstr "Geheue uitgeput" #~ msgid "Invalid preceding regular expression" #~ msgstr "Ongeldige vorige regex" #~ msgid "Premature end of regular expression" #~ msgstr "Premature einde vir regex" #~ msgid "Unmatched ) or \\)" #~ msgstr "Ongepaarde ) of \\)" #~ msgid "No previous regular expression" #~ msgstr "Geen vorige regex nie" sed-3.62/po/boldquot.sed0000644000076600007660000000033110143704210012105 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g s/“/“/g s/â€/â€/g s/‘/‘/g s/’/’/g sed-3.62/po/ca.gmo0000644000076600007660000002043210176462003010661 00000000000000•Þ?Y púq,l5™7Ï\`duÅl;b¨V Y b~ ¼ ;º Ë% † ¬ à Ýd ú _H s ¼ Ö õ!  5 J( _ ˆ# ¦ Ê$ ê#)BM2à ×ø*5*`‹« »#É#í&8,W„-²àö* @Ng€x› 7 :X@“|Ô\Qz®‘)»aIX«~™ƒÉ(ç-JmbÐhãLj„)¡Ëå6!8%Z'€0¨$Ù-þW,3„%¸$Þ%()9R0Œ!½ ß í'û'#.K%z2 Óñ8  E Z i w  « ½ Ô. ë20>3 ?, 91+$4:")7/.* 5#= -%< 6;&8('! If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. --help display this help and exit --version output version information and exit --posix disable all GNU extensions. -R, --regexp-perl use Perl 5's regular expressions syntax in the script. -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) -l N, --line-length=N specify the desired line-wrap length for the `l' command -n, --quiet, --silent suppress automatic printing of pattern space -r, --regexp-extended use extended regular expressions in the script. -s, --separate consider files as separate rather than as a single continuous long stream. -u, --unbuffered load minimal amounts of data from the input files and flush the output buffers more often %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]... `e' command not supported`}' doesn't want any addressesbased on GNU sed version %s can't find label for jump to `%s'cannot remove %s: %scannot rename %s: %scannot specify modifiers on empty regexpcommand only uses one addresscomments don't accept any addressescouldn't edit %s: is a terminalcouldn't edit %s: not a regular filecouldn't open file %s: %scouldn't open temporary file %s: %scouldn't write %d item to %s: %scouldn't write %d items to %s: %sdelimiter character is not a single-byte charactererror in subprocessexpected \ after `a', `c' or `i'expected newer version of sedextra characters after commandinvalid reference \%d on `s' command's RHSinvalid usage of +N or ~N as first addressinvalid usage of line address 0missing commandmultiple `!'smultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandno previous regular expressionnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %sstrings for `y' command are different lengthssuper-sed version %s unexpected `,'unexpected `}'unknown command: `%c'unknown option to `s'unmatched `{'unterminated `s' commandunterminated `y' commandunterminated address regexProject-Id-Version: sed 4.1.1 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-07-10 05:51+0200 Last-Translator: Jordi Mallach Language-Team: Catalan MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=n!=1; Si no es donen cap de les opcions -e, --expression, -f o --file, el primer argument no-opció es pren com el script sed a interpretar. Tots els arguments restants són noms de fitxers d'entrada; si no s'especifiquen fitxers d'entrada, es llegeix l'entrada estàndard. --help mostra aquest missatge d'ajuda i surt --version mostra la informació de la versió i surt --posix inhabilita totes les extensions GNU. -R, --regexp-perl usa la sintaxi d'expressions regulars de Perl 5 en aquesta sequència. -e script, --expression=script afegeix el script a les ordres a executar -f fitxer-script, --file=fitxer-script afegeix els continguts de fitxer-script a les ordres a executar -i[SUFIX], --in-place[=SUFIX] edita els mateixos fitxers (fa còpia de seguretat si es proveeix una extensió) -l N, --line-length=N especifica la longitud desitjada per a l'ajust de final de línia per a l'ordre «l» -n, --quiet, --silent suprimeix la impressió automàtica de l'espai de patrons -r, --regexp-extended usa expressions regulars exteses en el script. -s, --separate considera els fitxers com independents, en compte d'un llarg flux continu. -u, --unbuffered carrega una quantitat mínima de dades dels fitxers d'entrada i buida els búfers d'eixida més sovint %s Aquest és programari lliure; vegeu el codi font per les condicions de còpia. No hi ha CAP garantia; ni tan sols de COMERCIABILITAT o ADEQUACIÓ A UN PROPÒSIT PARTICULAR, fins on ho permeta la llei. %s: -e expressió #%lu, caràcter %lu: %s %s: no es pot llegir %s: %s %s: fitxer %s línia %lu: %s : no accepta cap adreçaEnvieu informes d'error a: %s. Assegureu-vos d'incloure la paraula «%s» en alguna part del camp «Assumpte:». GNU sed versió %s Forma d'ús: %s [OPCIÓ]... {script-només-si-no-hi-ha-altres-scripts} [fitxer-entrada]... l'ordre «e» no està suportada«}» no accepta cap adreçabasat en GNU sed versió %s no es troba l'etiqueta per al salt a «%s»no es pot eliminar %s: %sno es pot reanomenar %s: %sno es poden especificar modificadors en expregs buidesl'ordre utilitza només una adreçaels comentaris no accepten cap adreçano s'ha pogut editar %s: és un terminalno s'ha pogut editar %s: no és un fitxer regularno s'ha pogut obrir el fitxer %s: %sno s'ha pogut obrir el fitxer temporal %s: %sno s'ha pogut escriure %d element a %s: %sno s'han pogut escriure %d elements a %s: %sel caràcter delimitador no és un caràcter d'un bytes'ha produït un error en el subprocéss'espera \ després de «a», «c» i «i»s'esperava una versió més nova de sedhi ha caràcters extra després de l'ordrereferència \%d no vàlida en el costat dret de l'ordre «s»no es pot utilitzar +N o ~N com a primera adreçaús de l'adreça de línia 0 invàlidcal una ordremúltiples «!»múltiples opcions «g» per a l'ordre «s»múltiples opcions «p» per a l'ordre «s»múltiples opcions numèriques per a l'ordre «s»no hi ha una expressió regular prèvial'opció numèrica per a l'ordre «s» no pot ser zerol'opció «e» no està suportadaerror de lectura en %s: %sles cadenes per a l'ordre «y» són de longituds diferentssuper-sed versió %s «,» inesperada«}» inesperatordre desconeguda: «%c»opció desconeguda per a «s»«{» no emparellatordre «s» no terminadaordre «y» no terminadal'expressió regular d'adreça no està terminadased-3.62/po/ca.po0000644000076600007660000003602010176462000010512 00000000000000# Catalan translation of sed. # Copyright © 2002, 2003, 2004 Free Software Foundation, Inc. # This file is distributed under the same license as the sed package. # Jordi Mallach , 2002, 2003, 2004. # msgid "" msgstr "" "Project-Id-Version: sed 4.1.1\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-07-10 05:51+0200\n" "Last-Translator: Jordi Mallach \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=n!=1;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "opció desconeguda per a «s»" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "error de lectura en %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Nom de classe de caràcter no vàlid" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "«{» no emparellat" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "opció desconeguda per a «s»" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "cal una ordre" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "L'expressió regular és massa gran" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "l'opció «e» no està suportada" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "El contingut de \\{\\} no és vàlid" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 msgid "multiple `!'s" msgstr "múltiples «!»" #: sed/compile.c:163 msgid "unexpected `,'" msgstr "«,» inesperada" #: sed/compile.c:164 msgid "invalid usage of +N or ~N as first address" msgstr "no es pot utilitzar +N o ~N com a primera adreça" #: sed/compile.c:165 msgid "unmatched `{'" msgstr "«{» no emparellat" #: sed/compile.c:166 msgid "unexpected `}'" msgstr "«}» inesperat" #: sed/compile.c:167 msgid "extra characters after command" msgstr "hi ha caràcters extra després de l'ordre" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "s'espera \\ després de «a», «c» i «i»" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "«}» no accepta cap adreça" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": no accepta cap adreça" #: sed/compile.c:171 msgid "comments don't accept any addresses" msgstr "els comentaris no accepten cap adreça" #: sed/compile.c:172 msgid "missing command" msgstr "cal una ordre" #: sed/compile.c:173 msgid "command only uses one address" msgstr "l'ordre utilitza només una adreça" #: sed/compile.c:174 msgid "unterminated address regex" msgstr "l'expressió regular d'adreça no està terminada" #: sed/compile.c:175 msgid "unterminated `s' command" msgstr "ordre «s» no terminada" #: sed/compile.c:176 msgid "unterminated `y' command" msgstr "ordre «y» no terminada" #: sed/compile.c:177 msgid "unknown option to `s'" msgstr "opció desconeguda per a «s»" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "múltiples opcions «p» per a l'ordre «s»" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "múltiples opcions «g» per a l'ordre «s»" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "múltiples opcions numèriques per a l'ordre «s»" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "l'opció numèrica per a l'ordre «s» no pot ser zero" #: sed/compile.c:182 msgid "strings for `y' command are different lengths" msgstr "les cadenes per a l'ordre «y» són de longituds diferents" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "el caràcter delimitador no és un caràcter d'un byte" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "s'esperava una versió més nova de sed" #: sed/compile.c:185 msgid "invalid usage of line address 0" msgstr "ús de l'adreça de línia 0 invàlid" #: sed/compile.c:186 #, c-format msgid "unknown command: `%c'" msgstr "ordre desconeguda: «%c»" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: fitxer %s línia %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e expressió #%lu, caràcter %lu: %s\n" #: sed/compile.c:1644 #, c-format msgid "can't find label for jump to `%s'" msgstr "no es troba l'etiqueta per al salt a «%s»" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: no es pot llegir %s: %s\n" #: sed/execute.c:672 #, c-format msgid "couldn't edit %s: is a terminal" msgstr "no s'ha pogut editar %s: és un terminal" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "no s'ha pogut editar %s: no és un fitxer regular" #: lib/utils.c:196 sed/execute.c:683 #, c-format msgid "couldn't open temporary file %s: %s" msgstr "no s'ha pogut obrir el fitxer temporal %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "s'ha produït un error en el subprocés" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "l'opció «e» no està suportada" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "l'ordre «e» no està suportada" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "no hi ha una expressió regular prèvia" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "no es poden especificar modificadors en expregs buides" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "referència \\%d no vàlida en el costat dret de l'ordre «s»" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " usa la sintaxi d'expressions regulars de Perl 5 en aquesta\n" " sequència.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" "Forma d'ús: %s [OPCIÓ]... {script-només-si-no-hi-ha-altres-scripts}\n" " [fitxer-entrada]...\n" "\n" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" " -n, --quiet, --silent\n" " suprimeix la impressió automàtica de l'espai de patrons\n" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" " -e script, --expression=script\n" " afegeix el script a les ordres a executar\n" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" " -f fitxer-script, --file=fitxer-script\n" " afegeix els continguts de fitxer-script a les ordres a " "executar\n" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" " -i[SUFIX], --in-place[=SUFIX]\n" " edita els mateixos fitxers (fa còpia de seguretat si es\n" " proveeix una extensió)\n" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" " -l N, --line-length=N\n" " especifica la longitud desitjada per a l'ajust de final de\n" " línia per a l'ordre «l»\n" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" " --posix\n" " inhabilita totes les extensions GNU.\n" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -r, --regexp-extended\n" " usa expressions regulars exteses en el script.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" " -s, --separate\n" " considera els fitxers com independents, en compte d'un\n" " llarg flux continu.\n" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" " -u, --unbuffered\n" " carrega una quantitat mínima de dades dels fitxers " "d'entrada\n" " i buida els búfers d'eixida més sovint\n" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr " --help mostra aquest missatge d'ajuda i surt\n" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr " --version mostra la informació de la versió i surt\n" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" "\n" "Si no es donen cap de les opcions -e, --expression, -f o --file, el primer\n" "argument no-opció es pren com el script sed a interpretar. Tots els " "arguments\n" "restants són noms de fitxers d'entrada; si no s'especifiquen fitxers " "d'entrada,\n" "es llegeix l'entrada estàndard.\n" "\n" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Envieu informes d'error a: %s.\n" "Assegureu-vos d'incloure la paraula «%s» en alguna part del camp " "«Assumpte:».\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed versió %s\n" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "basat en GNU sed versió %s\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versió %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Aquest és programari lliure; vegeu el codi font per les condicions\n" "de còpia. No hi ha CAP garantia; ni tan sols de COMERCIABILITAT o\n" "ADEQUACIÓ A UN PROPÒSIT PARTICULAR, fins on ho permeta la llei.\n" #: lib/utils.c:98 lib/utils.c:336 #, c-format msgid "cannot remove %s: %s" msgstr "no es pot eliminar %s: %s" #: lib/utils.c:143 #, c-format msgid "couldn't open file %s: %s" msgstr "no s'ha pogut obrir el fitxer %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "no s'ha pogut escriure %d element a %s: %s" msgstr[1] "no s'han pogut escriure %d elements a %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "error de lectura en %s: %s" #: lib/utils.c:341 #, c-format msgid "cannot rename %s: %s" msgstr "no es pot reanomenar %s: %s" #~ msgid "Success" #~ msgstr "Èxit" #~ msgid "No match" #~ msgstr "Sense parella" #~ msgid "Invalid regular expression" #~ msgstr "Expressió regular no vàlida" #~ msgid "Invalid collation character" #~ msgstr "El caràcter de comparació no és vàlid" #~ msgid "Trailing backslash" #~ msgstr "Barra invertida al final" #~ msgid "Invalid back reference" #~ msgstr "La referència cap enrere no és vàlida" #~ msgid "Unmatched [ or [^" #~ msgstr "[ o [^ no emparellat" #~ msgid "Unmatched ( or \\(" #~ msgstr "«(» o \\( no emparellat" #~ msgid "Unmatched \\{" #~ msgstr "\\{ no emparellat" #~ msgid "Invalid range end" #~ msgstr "El rang final no és vàlid" #~ msgid "Memory exhausted" #~ msgstr "Memòria exhaurida" #~ msgid "Invalid preceding regular expression" #~ msgstr "L'expressió regular precedent no vàlida" #~ msgid "Premature end of regular expression" #~ msgstr "Fi prematur de l'expressió regular" #~ msgid "Unmatched ) or \\)" #~ msgstr ") o \\) no emparellat" #~ msgid "No previous regular expression" #~ msgstr "No hi ha una expressió regular prèvia" sed-3.62/po/cs.gmo0000644000076600007660000000375010176462003010707 00000000000000•Þ „ì0º1%ì)Cd`Å#ä#&,,S€[•çñ Ùú/¤J ï00A2r)¥Ï    %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. `}' doesn't want any addressesmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zeroread error on %s: %sProject-Id-Version: sed 3.02.80 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2001-08-05 19:52+02:00 Last-Translator: Vladimir Michl Language-Team: Czech MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-2 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: %s Toto je volné programové vybavení; podmínky pro kopírování a roz¹iøování naleznete ve zdrojových textech. Toto programové vybavení je zcela BEZ ZÁRUKY, a to i bez záruky PRODEJNOSTI nebo VHODNOSTI PRO NÌJAKÝ KONKRÉTNÍ ÚÈEL. %s: -e výraz #%lu, znak %lu: %s %s: %s nelze èíst: %s %s: soubor %s, øádek %lu: %s : nechce jakoukoliv adresuChyby v programu oznamujte na adrese: %s (anglicky). Kamkoliv do polo¾ky ``Subject:'' vlo¾te ``%s''. Pøipomínky k pøekladu zasílejte na adresu (èesky). `}' nevy¾aduje jakoukoliv adresuvícenásobné pou¾ití pøepínaèe `g' s pøíkazem `s'vícenásobné pou¾ití pøepínaèe `p' s pøíkazem `s'pøíkaz `s' mù¾e mít maximálnì jednu èíselnou volbuèíselná volba pøíkazu `s' nemù¾e být nulachyba pøi ètení z %s: %ssed-3.62/po/cs.po0000644000076600007660000002765110176462001010547 00000000000000# Czech translations for GNU sed package. # Copyright (C) 1998 Free Software Foundation, Inc. # Jaroslav Fojtik , 1998. # msgid "" msgstr "" "Project-Id-Version: sed 3.02.80\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2001-08-05 19:52+02:00\n" "Last-Translator: Vladimir Michl \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Neznámý pøepínaè pro `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "chyba pøi ètení z %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 msgid "invalid escape sequence in character class" msgstr "" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Neodpovídající `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Neznámý pøepínaè pro `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Chybìjící pøíkaz" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 msgid "regular expression too large" msgstr "" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 msgid "POSIX collating elements are not supported" msgstr "" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 msgid "invalid repeat counts in {}" msgstr "" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Vícenásobný `!'" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Neoèekáváná `,'" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "+N nebo ~N nelze pou¾ít jako první adresu" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Neodpovídající `{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Neoèekávaná `}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Nadbyteèné znaky po pøíkazu" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' nevy¾aduje jakoukoliv adresu" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": nechce jakoukoliv adresu" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "V komentáøi není pøípustná jakákoliv adresa" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Chybìjící pøíkaz" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Pøíkaz pou¾ívá pouze jedinou adresu" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Neukonèená adresa regulárního výrazu" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Neukonèený pøíkaz `s'" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Neukonèený pøíkaz `y'" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Neznámý pøepínaè pro `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "vícenásobné pou¾ití pøepínaèe `p' s pøíkazem `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "vícenásobné pou¾ití pøepínaèe `g' s pøíkazem `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "pøíkaz `s' mù¾e mít maximálnì jednu èíselnou volbu" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "èíselná volba pøíkazu `s' nemù¾e být nula" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "øetìzce pro pøíkaz `y' musí být stejnì dlouhé" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Chybné pou¾ití adresy modifikátoru" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Neznámý pøíkaz:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: soubor %s, øádek %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e výraz #%lu, znak %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Návì¹tí pro skok na `%s' nelze najít" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: %s nelze èíst: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Soubor %s nelze otevøít" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Soubor %s nelze otevøít" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Chyby v programu oznamujte na adrese: %s (anglicky).\n" "Kamkoliv do polo¾ky ``Subject:'' vlo¾te ``%s''.\n" "Pøipomínky k pøekladu zasílejte na adresu (èesky).\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" " %s\n" " Toto je volné programové vybavení; podmínky pro kopírování a roz¹iøování\n" "naleznete ve zdrojových textech. Toto programové vybavení je zcela BEZ " "ZÁRUKY,\n" "a to i bez záruky PRODEJNOSTI nebo VHODNOSTI PRO NÌJAKÝ KONKRÉTNÍ ÚÈEL.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: %s nelze èíst: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Soubor %s nelze otevøít" #: lib/utils.c:220 #, fuzzy, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "%d polo¾ek nelze do %s zapsat: %s" msgstr[1] "%d polo¾ek nelze do %s zapsat: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "chyba pøi ètení z %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: %s nelze èíst: %s\n" #, fuzzy #~ msgid "Unmatched [ or [^" #~ msgstr "Neodpovídající `{'" #, fuzzy #~ msgid "Unmatched ( or \\(" #~ msgstr "Neodpovídající `{'" #, fuzzy #~ msgid "Unmatched \\{" #~ msgstr "Neodpovídající `{'" #, fuzzy #~ msgid "Unmatched ) or \\)" #~ msgstr "Neodpovídající `{'" sed-3.62/po/da.gmo0000644000076600007660000000524510176462003010667 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^€tZõÀP$6Pku„ú!  0Q K " ° Ó ó ' 3 [ |      -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.8 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2003-10-25 08:00+0200 Last-Translator: Byrial Ole Jensen Language-Team: Danish MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=n != 1; -R, --regexp-perl brug Perl 5's syntaks for regulære udtryk i skriptet %s Dette er frit programmel; se kildeteksten for kopieringsbetingelser. Der er INGEN garanti; end ikke for SALGBARHED eller EGNETHED TIL NOGET BESTEMT FORMÅL, i det omfang som loven tillader. %s: -e udtryk nr. %lu, tegn %lu: %s %s: kan ikke læse %s: %s %s: fil %s, linje %lu: %s : vil ikke have adresserSend fejlrapporter på engelsk pr. e-post til %s. Sørg venligst for at skrive ordet "%s" et sted i "Subject:"-feltet. GNU sed version %s 'e'-kommando er ikke understøttet'}' vil ikke have adresserkunne ikke skrive %d element til %s: %skunne ikke skrive %d elementer til %s: %sfejl i underprocesforventede en nyere version af sedFlere 'g'-flag til 's'-kommandoFlere 'p'-flag til 's'-kommandoFlere tal-flag til 's'-kommandos-kommandoens tal-flag må ikke være nultilvalg 'e' er ikke understøttetlæsefejl på %s: %ssuper-sed version %s sed-3.62/po/da.po0000644000076600007660000003244110176462001010517 00000000000000# Danish messages for sed # Copyright (C) 2001 Free Software Foundation, Inc. # Byrial Ole Jensen , 2001-2003. # msgid "" msgstr "" "Project-Id-Version: sed 4.0.8\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2003-10-25 08:00+0200\n" "Last-Translator: Byrial Ole Jensen \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Ukendt tilvalg til 's'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "læsefejl på %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Ugyldigt navn på tegnklasse" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Uparret '{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Ukendt tilvalg til 's'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Der mangler en kommando" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Regulært udtryk for stort" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "tilvalg 'e' er ikke understøttet" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Ugyldigt indhold af \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Flere '!'" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Uventet ','" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Kan ikke bruge +N eller ~N som første adresse" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Uparret '{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Uventet '}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Ekstra tegn efter kommando" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Forventede \\ efter 'a', 'c' eller 'i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "'}' vil ikke have adresser" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": vil ikke have adresser" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Kommentarer vil ikke have adresser" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Der mangler en kommando" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Kommandoen bruger kun én adresse" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Uafsluttet regulært udtryk for adresse" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Uafsluttet 's'-kommando" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Uafsluttet 'y'-kommando" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Ukendt tilvalg til 's'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "Flere 'p'-flag til 's'-kommando" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "Flere 'g'-flag til 's'-kommando" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "Flere tal-flag til 's'-kommando" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "s-kommandoens tal-flag må ikke være nul" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "y-kommandoens strenge har forskellige længder" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "forventede en nyere version af sed" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Forkert brug af adresse-ændrer" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Ukendt kommando:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: fil %s, linje %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e udtryk nr. %lu, tegn %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Kan ikke finde etiket for hop til '%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: kan ikke læse %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "kunne ikke åbne filen %s: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "kunne ikke åbne midlertidig fil %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "fejl i underproces" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "tilvalg 'e' er ikke understøttet" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "'e'-kommando er ikke understøttet" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Intet forudgående regulært udtryk" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Der kan ikke angives ændrere til tomt regulært udtryk" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Ugyldig reference \\%d på 's'-kommandos højreside" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " brug Perl 5's syntaks for regulære udtryk i skriptet\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " brug Perl 5's syntaks for regulære udtryk i skriptet\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Send fejlrapporter på engelsk pr. e-post til %s.\n" "Sørg venligst for at skrive ordet \"%s\" et sted i \"Subject:\"-feltet.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed version %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "baseret på GNU sed version 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed version %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Dette er frit programmel; se kildeteksten for kopieringsbetingelser.\n" "Der er INGEN garanti; end ikke for SALGBARHED eller EGNETHED TIL NOGET\n" "BESTEMT FORMÅL, i det omfang som loven tillader.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: kan ikke læse %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "kunne ikke åbne filen %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "kunne ikke skrive %d element til %s: %s" msgstr[1] "kunne ikke skrive %d elementer til %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "læsefejl på %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: kan ikke læse %s: %s\n" #~ msgid "Success" #~ msgstr "Godt resultat" #~ msgid "No match" #~ msgstr "Intet resultat" #~ msgid "Invalid regular expression" #~ msgstr "Ugyldigt regulært udtryk" #~ msgid "Invalid collation character" #~ msgstr "Ugyldigt sorteringstegn" #~ msgid "Trailing backslash" #~ msgstr "Afsluttende omvendt skråstreg" #~ msgid "Invalid back reference" #~ msgstr "Ugyldig reference bagud" #~ msgid "Unmatched [ or [^" #~ msgstr "Uparret [ eller [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "Uparret ( eller \\(" #~ msgid "Unmatched \\{" #~ msgstr "Uparret \\{" #~ msgid "Invalid range end" #~ msgstr "Ugyldig slutning på område" #~ msgid "Memory exhausted" #~ msgstr "Hukommelsen opbrugt" #~ msgid "Invalid preceding regular expression" #~ msgstr "Ugyldigt forudgående regulært udtryk" #~ msgid "Premature end of regular expression" #~ msgstr "Ufuldstændigt regulært udtryk" #~ msgid "Unmatched ) or \\)" #~ msgstr "Uparret ) eller \\)" #~ msgid "No previous regular expression" #~ msgstr "Intet forudgående regulært udtryk" sed-3.62/po/de.gmo0000644000076600007660000000564310176462003010675 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^wt_ìL&Ý  ! =} Y ×# ë Q + } ’" ²" Õ) ø3 "! V x      -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.6 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2003-03-21 22:03:41+0100 Last-Translator: Walter Koch Language-Team: German MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=(n != 1); -R, --regexp-perl Verwende die Perl 5 - Syntax für reg.Ausdrücke im Script. %s (Der folgende Text ist eine nicht überprüfte Übersetzung, die zur Information dient; in rechtlichen Fragen ist immer das englische Original ausschlaggebend) Dieses Program ist freie Software; In den Quelldateien können Sie die Bedingungen für die Weitergabe nachlesen. Es gibt KEINE GARANTIE; nicht einmal die implizite Garantie der MARKTFÄHIGKEIT oder der ERFÜLLUNG EINES BESTIMMTEN ZWECKES. %s: -e Ausdruck #%lu, Zeichen %lu: %s %s: kann %s nicht lesen: %s %s: Datei %s Zeile %lu: %s `:' erwartet keine AdressenFehlerberichte (in Englisch!) per E-Mail an: %s . Verwenden Sie dabei den Begriff ``%s'' irgendwo in der ``Betreff:''-Zeile. GNU sed Version %s `e'-Kommando wird nicht unterstützt`}' erwartet keine AdressenKann %d Feld nicht auf %s schreiben: %sKann %d Felder nicht auf %s schreiben: %sFehler im SubprozessNeuere Version von sed erwartetMehrere 'g'-Optionen am `s'-BefehlMehrere 'p'-Optionen am `s'-BefehlMehrere numerische Optionen am `s'-BefehlNumerisch Option am `s'-Befehl darf nicht Null seinOption `e' wird nicht unterstütztLesefehler in %s: %sSuper-sed version %s sed-3.62/po/de.po0000644000076600007660000003342610176462001010527 00000000000000# sed german translation # Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. # Walter Koch , 2001, 2002, 2003 # msgid "" msgstr "" "Project-Id-Version: sed 4.0.6\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2003-03-21 22:03:41+0100\n" "Last-Translator: Walter Koch \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Unbekannte Option betreffs `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "Lesefehler in %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Ungültige Zeichenklassenname" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Nicht paarweises `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Unbekannte Option betreffs `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Fehlender Befehl" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Regulärer Ausdruck ist zu groß" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "Option `e' wird nicht unterstützt" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Ungültiger Inhalt in \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Mehrfache `!'" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Unerwartetes `,'" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "+N oder ~N können nicht als erste Adresse benutzt werden" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Nicht paarweises `{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Unerwartetes `}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Zusätzliche Zeichen nach dem Befehl" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Nach `a', `c' oder `i' wird \\ erwartet" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' erwartet keine Adressen" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr "`:' erwartet keine Adressen" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Kommentare erlauben keine Adressen" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Fehlender Befehl" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Befehl verwendet nur eine Adresse" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Nicht beendeter regulärer Adressausdruck" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Nicht beendeter `s'-Befehl" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Nicht beendeter `y'-Befehl" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Unbekannte Option betreffs `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "Mehrere 'p'-Optionen am `s'-Befehl" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "Mehrere 'g'-Optionen am `s'-Befehl" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "Mehrere numerische Optionen am `s'-Befehl" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "Numerisch Option am `s'-Befehl darf nicht Null sein" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "Unterschiedliche Länge der Zeichenketten am `y'-Befehl" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "Neuere Version von sed erwartet" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Befehl verwendet nur eine Adresse" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Unbekannter Befehl:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: Datei %s Zeile %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e Ausdruck #%lu, Zeichen %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Kann das Ziel für den Sprung nach `%s' nicht finden" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: kann %s nicht lesen: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Datei %s kann nicht geöffnet werden: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Datei %s kann nicht geöffnet werden: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "Fehler im Subprozess" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "Option `e' wird nicht unterstützt" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "`e'-Kommando wird nicht unterstützt" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Kein vorheriger regulärer Ausdruck" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Auf leere reguläre Ausdrücke können keine `modifier' angewandt werden" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Ungültiger Verweis \\%d in den Haltepuffer des `s'-Befehls" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " Verwende die Perl 5 - Syntax für reg.Ausdrücke im Script.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " Verwende die Perl 5 - Syntax für reg.Ausdrücke im Script.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Fehlerberichte (in Englisch!) per E-Mail an: %s .\n" "Verwenden Sie dabei den Begriff ``%s'' irgendwo in der ``Betreff:''-Zeile.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "Super-sed version %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "basiert auf GNU sed Version 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed Version %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "(Der folgende Text ist eine nicht überprüfte Übersetzung, die zur\n" " Information dient; in rechtlichen Fragen ist immer das englische\n" " Original ausschlaggebend)\n" "\n" "Dieses Program ist freie Software; In den Quelldateien können Sie die\n" "Bedingungen für die Weitergabe nachlesen.\n" "Es gibt KEINE GARANTIE; nicht einmal die implizite Garantie der\n" "MARKTFÄHIGKEIT oder der ERFÜLLUNG EINES BESTIMMTEN ZWECKES.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: kann %s nicht lesen: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Datei %s kann nicht geöffnet werden: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "Kann %d Feld nicht auf %s schreiben: %s" msgstr[1] "Kann %d Felder nicht auf %s schreiben: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "Lesefehler in %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: kann %s nicht lesen: %s\n" #~ msgid "Success" #~ msgstr "Erfolgreich" #~ msgid "No match" #~ msgstr "Keine Übereinstimmung" #~ msgid "Invalid regular expression" #~ msgstr "Ungültiger regulärer Ausdruck" #~ msgid "Invalid collation character" #~ msgstr "Ungültiger Vergleichszeichen" #~ msgid "Trailing backslash" #~ msgstr "Abschliessender Backslash" #~ msgid "Invalid back reference" #~ msgstr "Ungültiger Rückwärtsverweis" #~ msgid "Unmatched [ or [^" #~ msgstr "Nicht paarweises [ bzw. [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "Nicht paarweises ( bzw. \\(" #~ msgid "Unmatched \\{" #~ msgstr "Nicht paarweises \\{" #~ msgid "Invalid range end" #~ msgstr "Ungültiges Bereichende" #~ msgid "Memory exhausted" #~ msgstr "Speicher erschöpft" #~ msgid "Invalid preceding regular expression" #~ msgstr "Vorheriger regulärer Ausdruck ist ungültig" #~ msgid "Premature end of regular expression" #~ msgstr "Regulärer Ausdruck endet zu früh" #~ msgid "Unmatched ) or \\)" #~ msgstr "Nicht paarweises ) bzw. \\)" #~ msgid "No previous regular expression" #~ msgstr "Kein vorheriger regulärer Ausdruck" sed-3.62/po/el.gmo0000644000076600007660000000432010176462003010674 00000000000000•Þœxºy%4Zq‹d¨ 'F#Z#~&¢,Éö_$õ„(z"£Æäƒ…!¤Æ&ß&*-;X”´     %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. `e' command not supported`}' doesn't want any addresseserror in subprocessmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %sProject-Id-Version: GNU sed 3.02.80 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2002-03-08 12:57+0000 Last-Translator: Simos Xenitellis Language-Team: Greek MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-7 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: %s Áõôü ôï ðñüãñáììá åßíáé åëåýèåñï ëïãéóìéêü· äåßôå ôïí ðçãáßï êþäéêá ãéá ôïõò êáíïíéóìïýò áíôéãñáöÞò. Äåí õðÜñ÷åé ÊÁÌÉÁ ÅÃÃÕÇÓÇ· ïýôå áêüìá ãéá ËÅÉÔÏÕÑÃÉÊÏÔÇÔÁ Þ ÊÁÔÁËËÇËÏÔÇÔÁ ÃÉÁ ÅÍÁ ÓÕÃÊÅÊÑÉÌÅÍÏ ÓÊÏÐÏ, ìÝ÷ñé ôï óçìåßï ðïõ åðéôñÝðåé ï íüìïò. %s: -e Ýêöñáóç #%lu, ÷áñáêôÞñáò %lu: %s %s: áäõíáìßá óôçí áíÜãíùóç %s: %s %s: áñ÷åßï %s ãñáììÞ %lu: %s : äåí ÷ñåéÜæåôáé äéåõèýíóåéòÁíáöïñÝò óöáëìÜôùí ìÝóù çëåêôñïíéêïý ôá÷õäñïìåßïõ óôï: %s . ÐñïóÝîôå íá óõìðåñéëÜâåôå ôç ëÝîç ``%s'' êÜðïõ óôï ðåäßï ``Subject:''. äåí õðïóôçñßæåôáé ç åíôïëÞ `e'ôï `}' äåí ÷ñåéÜæåôáé äéåõèýíóåéòóöÜëìá óôç õðïäéáäéêáóßáðïëëáðëÝò åðéëïãÝò `g' óôçí åíôïëÞ `s'ðïëëáðëÝò åðéëïãÝò `p' óôçí åíôïëÞ `s'ðïëëáðëüò åðéëïãÝò áñéèìïý óôçí åíôïëÞ `s'ç åðéëïãÞ áñéèìïý óôçí åíôïëÞ `s' äåí ìðïñåß íá åßíáé ìçäÝíäåí õðïóôçñßæåôáé ç åðéëïãÞ `e'óöÜëìá áíÜãíùóçò óôï %s: %ssed-3.62/po/el.po0000644000076600007660000003213010176462001010526 00000000000000# Greek messages for GNU sed. # Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. # Simos Xenitellis , 1998, 1999, 2000, 2001, 2002. # msgid "" msgstr "" "Project-Id-Version: GNU sed 3.02.80\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2002-03-08 12:57+0000\n" "Last-Translator: Simos Xenitellis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-7\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "¶ãíùóôç åðéëïãÞ ãéá ôï `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "óöÜëìá áíÜãíùóçò óôï %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "ìç Ýãêõñï áêïëïõèßá äéáöõãÞò óå êëÜóç ÷áñáêôÞñùí" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Áôáßñéáóôï `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "¶ãíùóôç åðéëïãÞ ãéá ôï `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Ëåßðåé ç åíôïëÞ" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "ðïëý ìåãÜëç êáíïíéêÞ Ýêöñáóç" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "äåí õðïóôçñßæåôáé ç åðéëïãÞ `e'" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "ìç Ýãêõñï ðåñéå÷üìåíï äåéêôþí åðáíÜëçøçò {}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "ÐïëëáðëÜ `!'s" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "ÁíáðÜíôå÷ï `,'" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Äåí åßíáé äõíáôÞ ç ÷ñÞóç ôùí +N Þ ~N ãéá ðñþôç äéåýèõíóç" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Áôáßñéáóôï `{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Áôáßñéáóôï `}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "ÅðéðëÝïí ÷áñáêôÞñåò ìåôÜ ôçí åíôïëÞ" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Áðáéôåßôáé \\ ìåôÜ ôéò åíôïëÝò `a', `c' Þ `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "ôï `}' äåí ÷ñåéÜæåôáé äéåõèýíóåéò" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": äåí ÷ñåéÜæåôáé äéåõèýíóåéò" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Ôá ó÷üëéá äåí äÝ÷ïíôáé äéåõèýíóåéò" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Ëåßðåé ç åíôïëÞ" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Ç åíôïëÞ ÷ñçóéìïðïéåß ìüíï ìéá äéåýèõíóç" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Ìç ôåñìáôéóìÝíç äéåýèõíóç êáíïíéêÞò Ýêöñáóçò" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Ìç ôåñìáôéóìÝíç åíôïëÞ `s'" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Ìç ôåñìáôéóìÝíç åíôïëÞ `y'" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "¶ãíùóôç åðéëïãÞ ãéá ôï `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "ðïëëáðëÝò åðéëïãÝò `p' óôçí åíôïëÞ `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "ðïëëáðëÝò åðéëïãÝò `g' óôçí åíôïëÞ `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "ðïëëáðëüò åðéëïãÝò áñéèìïý óôçí åíôïëÞ `s'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "ç åðéëïãÞ áñéèìïý óôçí åíôïëÞ `s' äåí ìðïñåß íá åßíáé ìçäÝí" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "ôá áëöáñéèìçôéêÜ ãéá ôçí åíôïëÞ `y' åßíáé äéáöïñåôéêïý ìåãÝèïõò" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "ÁêáôÜëëçëç ÷ñÞóç ôïõ äéáìïñöùôÞ äéåýèõíóçò" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "¶ãíùóôç åíôïëÞ:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: áñ÷åßï %s ãñáììÞ %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e Ýêöñáóç #%lu, ÷áñáêôÞñáò %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Äåí Þôáí äõíáôÞ ç åýñåóç åôéêÝôôáò ãéá ìåôÜâáóç óôï `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: áäõíáìßá óôçí áíÜãíùóç %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Äåí ìðüñåóá íá áíïßîù ôï áñ÷åßï %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Äåí ìðüñåóá íá áíïßîù ôï áñ÷åßï %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "óöÜëìá óôç õðïäéáäéêáóßá" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "äåí õðïóôçñßæåôáé ç åðéëïãÞ `e'" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "äåí õðïóôçñßæåôáé ç åíôïëÞ `e'" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Äåí âñÝèçêå ðñïçãïýìåíç êáíïíéêÞ Ýêöñáóç" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "äåí åðéôñÝðåôáé ï ïñéóìüò äéáìïñöùôþí óå êåíÞ êáíïíéêÞ Ýêöñáóç" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Ìç Ýãêõñç áíáöïñÜ \\%d óôï äåîß ôìÞìá ôçò åíôïëÞò `s'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "ÁíáöïñÝò óöáëìÜôùí ìÝóù çëåêôñïíéêïý ôá÷õäñïìåßïõ óôï: %s .\n" "ÐñïóÝîôå íá óõìðåñéëÜâåôå ôç ëÝîç ``%s'' êÜðïõ óôï ðåäßï ``Subject:''.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Áõôü ôï ðñüãñáììá åßíáé åëåýèåñï ëïãéóìéêü· äåßôå ôïí ðçãáßï êþäéêá ãéá " "ôïõò\n" "êáíïíéóìïýò áíôéãñáöÞò. Äåí õðÜñ÷åé ÊÁÌÉÁ ÅÃÃÕÇÓÇ· ïýôå áêüìá ãéá\n" "ËÅÉÔÏÕÑÃÉÊÏÔÇÔÁ Þ ÊÁÔÁËËÇËÏÔÇÔÁ ÃÉÁ ÅÍÁ ÓÕÃÊÅÊÑÉÌÅÍÏ ÓÊÏÐÏ, ìÝ÷ñé ôï óçìåßï\n" "ðïõ åðéôñÝðåé ï íüìïò.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: áäõíáìßá óôçí áíÜãíùóç %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Äåí ìðüñåóá íá áíïßîù ôï áñ÷åßï %s" #: lib/utils.c:220 #, fuzzy, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "áäýíáôç ç åããñáöÞ %d óôïé÷åßùí óôï %s: %s" msgstr[1] "áäýíáôç ç åããñáöÞ %d óôïé÷åßùí óôï %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "óöÜëìá áíÜãíùóçò óôï %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: áäõíáìßá óôçí áíÜãíùóç %s: %s\n" #, fuzzy #~ msgid "Invalid regular expression" #~ msgstr "Äåí âñÝèçêå ðñïçãïýìåíç êáíïíéêÞ Ýêöñáóç" #, fuzzy #~ msgid "Invalid collation character" #~ msgstr "ìç Ýãêõñï áêïëïõèßá äéáöõãÞò óå êëÜóç ÷áñáêôÞñùí" #, fuzzy #~ msgid "Unmatched [ or [^" #~ msgstr "Áôáßñéáóôï `{'" #, fuzzy #~ msgid "Unmatched ( or \\(" #~ msgstr "Áôáßñéáóôï `{'" #, fuzzy #~ msgid "Unmatched \\{" #~ msgstr "Áôáßñéáóôï `{'" #, fuzzy #~ msgid "Invalid preceding regular expression" #~ msgstr "Äåí âñÝèçêå ðñïçãïýìåíç êáíïíéêÞ Ýêöñáóç" #, fuzzy #~ msgid "Premature end of regular expression" #~ msgstr "Äåí âñÝèçêå ðñïçãïýìåíç êáíïíéêÞ Ýêöñáóç" #, fuzzy #~ msgid "Unmatched ) or \\)" #~ msgstr "Áôáßñéáóôï `{'" #~ msgid "No previous regular expression" #~ msgstr "Äåí âñÝèçêå ðñïçãïýìåíç êáíïíéêÞ Ýêöñáóç" sed-3.62/po/en@boldquot.header0000644000076600007660000000247110143704211013215 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # sed-3.62/po/en@quot.header0000644000076600007660000000226310143704211012353 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # sed-3.62/po/eo.gmo0000644000076600007660000000521510176462003010703 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^¥t^¹y#3WqQ¥÷  #D ; € ”! µ! ×$ ù.  M d x     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: GNU sed 4.0.8 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2003-10-26 20:57+0000 Last-Translator: Edmund GRIMLEY EVANS Language-Team: Esperanto MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8-bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=(n != 1); -R, --regexp-perl uzi sintakso de Perl 5 por regulaj esprimoj en programo. %s Ĉi tio estas libera programo; vidu la fonton por kopi-kondiĉoj. Estas NENIA GARANTIO; eĉ ne por KOMERCA KVALITO aÅ­ ADEKVATECO POR DIFINITA CELO, laÅ­ la grado permesita de juro. %s: -e esprimo #%lu, signo %lu: %s %s: ne povas legi %s: %s %s: dosiero %s linio %lu: %s : ne deziras adresojnRetpoÅtu cimo-raportojn al: %s . Nepre menciu la vorton '%s' ie en la temlinio. GNU sed versio %s komando 'e' ne realigita'}' ne deziras adresojnne povis skribi %d eron al %s: %sne povis skribi %d erojn al %s: %seraro en subprocezoatendis pli novan version de sedpluraj 'g'-opcioj por komando 's'pluraj 'p'-opcioj por komando 's'pluraj nombro-opcioj por komando 's'nombro-opcio por komando 's' ne povas esti nulopcio 'e' ne realigitalegeraro ĉe %s: %ssuper-sed versio %s sed-3.62/po/eo.po0000644000076600007660000003234110176462001010535 00000000000000# Esperantaj mesaÄoj por GNU sed. # Copyright (C) 2002 Free Software Foundation, Inc. # Edmund GRIMLEY EVANS , 2001-2003. # msgid "" msgstr "" "Project-Id-Version: GNU sed 4.0.8\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2003-10-26 20:57+0000\n" "Last-Translator: Edmund GRIMLEY EVANS \n" "Language-Team: Esperanto \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8-bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Nekonata opcio por 's'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "legeraro ĉe %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Nevalida nomo de signoklaso" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Neparigita '{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Nekonata opcio por 's'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Mankas komando" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Regula esprimo tro granda" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "opcio 'e' ne realigita" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Nevalida enhavo de \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Pluraj '!'oj" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Neatendita ','" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Ne eblas uzi +N aÅ­ ~N kiel unuan adreson" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Neparigita '{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Neatendita '}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Kromaj signoj post komando" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Atendita \\ post 'a', 'c' aÅ­ 'i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "'}' ne deziras adresojn" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": ne deziras adresojn" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Komentoj ne akceptas adresojn" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Mankas komando" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Komando uzas nur unu adreson" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Nefinita adresa regesp" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Nefinita komando 's'" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Nefinita komando 'y'" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Nekonata opcio por 's'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "pluraj 'p'-opcioj por komando 's'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "pluraj 'g'-opcioj por komando 's'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "pluraj nombro-opcioj por komando 's'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "nombro-opcio por komando 's' ne povas esti nul" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "ĉenoj por komando 'y' havas malsamajn longojn" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "atendis pli novan version de sed" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Nevalida uzo de adresmodifilo" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Nekonata komando:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: dosiero %s linio %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e esprimo #%lu, signo %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Ne povas trovi etikedon por salto al '%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: ne povas legi %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Ne povis malfermi dosieron %s: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Ne povis malfermi dumtempan dosieron %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "eraro en subprocezo" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "opcio 'e' ne realigita" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "komando 'e' ne realigita" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Mankas antaÅ­a regula esprimo" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Ne eblas specifi modifilojn ĉe malplena regula esprimo" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Nevalida referenco \\%d ĉe dekstra flanko de komando 's'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " uzi sintakso de Perl 5 por regulaj esprimoj en programo.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " uzi sintakso de Perl 5 por regulaj esprimoj en programo.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "RetpoÅtu cimo-raportojn al: %s .\n" "Nepre menciu la vorton '%s' ie en la temlinio.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed versio %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "bazita sur \"GNU sed\" versio 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versio %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Ĉi tio estas libera programo; vidu la fonton por kopi-kondiĉoj. Estas\n" "NENIA GARANTIO; eĉ ne por KOMERCA KVALITO aÅ­ ADEKVATECO POR DIFINITA CELO,\n" "laÅ­ la grado permesita de juro.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: ne povas legi %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Ne povis malfermi dosieron %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "ne povis skribi %d eron al %s: %s" msgstr[1] "ne povis skribi %d erojn al %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "legeraro ĉe %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: ne povas legi %s: %s\n" #~ msgid "Success" #~ msgstr "Sukceso" #~ msgid "No match" #~ msgstr "Maltrafo" #~ msgid "Invalid regular expression" #~ msgstr "Nevalida regula esprimo" #~ msgid "Invalid collation character" #~ msgstr "Nevalida kunfanda signo" #~ msgid "Trailing backslash" #~ msgstr "Malsuprenstreko ĉe fino" #~ msgid "Invalid back reference" #~ msgstr "Nevalida retroreferenco" #~ msgid "Unmatched [ or [^" #~ msgstr "Neparigita [ aÅ­ [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "Neparigita ( aÅ­ \\(" #~ msgid "Unmatched \\{" #~ msgstr "Neparigita \\{" #~ msgid "Invalid range end" #~ msgstr "Nevalida fino de gamo" #~ msgid "Memory exhausted" #~ msgstr "Mankas memoro" #~ msgid "Invalid preceding regular expression" #~ msgstr "Nevalida antaÅ­a regula esprimo" #~ msgid "Premature end of regular expression" #~ msgstr "Neatendita fino de regula esprimo" #~ msgid "Unmatched ) or \\)" #~ msgstr "Neparigita ) aÅ­ \\)" #~ msgid "No previous regular expression" #~ msgstr "Mankas antaÅ­a regula esprimo" sed-3.62/po/es.gmo0000644000076600007660000000550210176462004010707 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^‰t{þÏz(Js®|Ì I" ] €U   ö+ ( 9( b. ‹7 º! ò  ,     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.8 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2003-10-24 12:38-0500 Last-Translator: Cristian Othón Martínez Vera Language-Team: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8-bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=(n != 1); -R, --regexp-perl utilizar la sintaxis de expresiones regulares de Perl 5 en el guión. %s Esto es software libre; vea el código fuente para las condiciones de copia. No hay NINGUNA garantía; ni siquiera de COMERCIABILIDAD o IDONEIDAD PARA UN FIN DETERMINADO, en la extensión permitida por ley. %s: -e expresión #%lu, carácter %lu: %s %s: no se puede leer %s: %s %s: fichero %s línea %lu: %s : no acepta ninguna direcciónEnvíe reportes de bichos por e-mail a: %s . Asegúrese de incluir la palabra ``%s'' en algún lugar en el campo ``Subject:''. GNU sed versión %s no hay soporte para el comando `e'`}' no acepta ninguna direcciónno se puede escribir %d elemento a %s: %sno se pueden escribir %d elementos a %s: %serror en el subprocesose esperaba una versión más reciente de sedmúltiples opciones `g' para la orden `s'múltiples opciones `p' para la orden `s'múltiples opciones numéricas para la orden `s'una opción numérica para la orden `s' no puede ser cerono hay soporte para la opción `e'error al leer de %s: %ssuper-sed versión %s sed-3.62/po/es.po0000644000076600007660000003330710176462001010544 00000000000000# Mensajes en español para GNU sed. # Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. # Cristian Othón Martínez Vera , 2001, 2002, 2003. # msgid "" msgstr "" "Project-Id-Version: sed 4.0.8\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2003-10-24 12:38-0500\n" "Last-Translator: Cristian Othón Martínez Vera \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8-bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Opción desconocida para `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "error al leer de %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Carácter de nombre de clase inválido" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "`{' sin pareja" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Opción desconocida para `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Orden faltante" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Expresión regular demasiado grande" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "no hay soporte para la opción `e'" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Contenido inválido de \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "'!'s múltiples" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "`,' inesperada" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "No se pueden usar +N o ~N como primera dirección" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "`{' sin pareja" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "`}' inesperado" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Caracteres extra después de la orden" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Se esperaba \\ después de `a', `c' ó `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' no acepta ninguna dirección" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": no acepta ninguna dirección" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Los comentarios no aceptan ninguna dirección" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Orden faltante" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "La orden solamente usa una dirección" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Dirección de expresión regular sin terminar" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Orden `s' sin terminar" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Orden `y' sin terminar" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Opción desconocida para `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "múltiples opciones `p' para la orden `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "múltiples opciones `g' para la orden `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "múltiples opciones numéricas para la orden `s'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "una opción numérica para la orden `s' no puede ser cero" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "las cadenas para la orden y son de longitudes diferentes" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "se esperaba una versión más reciente de sed" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Uso inválido de un modificador de dirección" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Orden desconocida:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: fichero %s línea %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e expresión #%lu, carácter %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "No se puede encontrar la etiqueta para saltar a `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: no se puede leer %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "No se puede abrir el fichero %s: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "No se puede abrir el fichero temporal %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "error en el subproceso" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "no hay soporte para la opción `e'" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "no hay soporte para el comando `e'" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "No hay una expresión regular previa" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "No se pueden especificar modificadores en expresiones regulares vacías" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Referencia \\%d inválida en el lado derecho del comando `s'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " utilizar la sintaxis de expresiones regulares de Perl 5\n" " en el guión.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " utilizar la sintaxis de expresiones regulares de Perl 5\n" " en el guión.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Envíe reportes de bichos por e-mail a: %s .\n" "Asegúrese de incluir la palabra ``%s'' en algún lugar en el campo " "``Subject:''.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed versión %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "basado en GNU sed versión 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versión %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Esto es software libre; vea el código fuente para las condiciones de copia.\n" "No hay NINGUNA garantía; ni siquiera de COMERCIABILIDAD o IDONEIDAD PARA UN\n" "FIN DETERMINADO, en la extensión permitida por ley.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: no se puede leer %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "No se puede abrir el fichero %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "no se puede escribir %d elemento a %s: %s" msgstr[1] "no se pueden escribir %d elementos a %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "error al leer de %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: no se puede leer %s: %s\n" #~ msgid "Success" #~ msgstr "Éxito" #~ msgid "No match" #~ msgstr "No hay coincidencia" #~ msgid "Invalid regular expression" #~ msgstr "Expresion regular inválida" #~ msgid "Invalid collation character" #~ msgstr "Carácter de ordenamiento inválido" #~ msgid "Trailing backslash" #~ msgstr "Diagonal invertida al final" #~ msgid "Invalid back reference" #~ msgstr "Referencia hacia atrás inválida" #~ msgid "Unmatched [ or [^" #~ msgstr "[ ó [^ sin pareja" #~ msgid "Unmatched ( or \\(" #~ msgstr "( ó \\( sin pareja" #~ msgid "Unmatched \\{" #~ msgstr "\\{ sin pareja" #~ msgid "Invalid range end" #~ msgstr "Final de rango inválido" #~ msgid "Memory exhausted" #~ msgstr "Memoria agotada" #~ msgid "Invalid preceding regular expression" #~ msgstr "Expresión regular precedente inválida" #~ msgid "Premature end of regular expression" #~ msgstr "Final prematuro de la expresión regular" #~ msgid "Unmatched ) or \\)" #~ msgstr ") ó \\) sin pareja" #~ msgid "No previous regular expression" #~ msgstr "No hay una expresión regular previa" sed-3.62/po/et.gmo0000644000076600007660000001725010176462004010713 00000000000000•Þ?Y púq,l5™7Ï\`duÅl;b¨V Y b~ ¼ ;º Ë% † ¬ à Ýd ú _H s ¼ Ö õ!  5 J( _ ˆ# ¦ Ê$ ê#)BM2à ×ø*5*`‹« »#É#í&8,W„-²àö* @Ng€‡›Û#3ÿ639jY¤TþlSmÀP.SaÓT5‡Š­$ÀåÿQ,~R“æû(0Yq3ŽÂá$ÿ-$R!laŽ)ð#.Ro(ˆ,± Þ ÿ  0Jj%ˆ®Ã$Öû  ,@ YdxŒ20>3 ?, 91+$4:")7/.* 5#= -%< 6;&8('! If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. --help display this help and exit --version output version information and exit --posix disable all GNU extensions. -R, --regexp-perl use Perl 5's regular expressions syntax in the script. -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) -l N, --line-length=N specify the desired line-wrap length for the `l' command -n, --quiet, --silent suppress automatic printing of pattern space -r, --regexp-extended use extended regular expressions in the script. -s, --separate consider files as separate rather than as a single continuous long stream. -u, --unbuffered load minimal amounts of data from the input files and flush the output buffers more often %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]... `e' command not supported`}' doesn't want any addressesbased on GNU sed version %s can't find label for jump to `%s'cannot remove %s: %scannot rename %s: %scannot specify modifiers on empty regexpcommand only uses one addresscomments don't accept any addressescouldn't edit %s: is a terminalcouldn't edit %s: not a regular filecouldn't open file %s: %scouldn't open temporary file %s: %scouldn't write %d item to %s: %scouldn't write %d items to %s: %sdelimiter character is not a single-byte charactererror in subprocessexpected \ after `a', `c' or `i'expected newer version of sedextra characters after commandinvalid reference \%d on `s' command's RHSinvalid usage of +N or ~N as first addressinvalid usage of line address 0missing commandmultiple `!'smultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandno previous regular expressionnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %sstrings for `y' command are different lengthssuper-sed version %s unexpected `,'unexpected `}'unknown command: `%c'unknown option to `s'unmatched `{'unterminated `s' commandunterminated `y' commandunterminated address regexProject-Id-Version: sed 4.1.1 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-07-09 16:33+0300 Last-Translator: Toomas Soome Language-Team: Estonian MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8-bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=(n != 1); Kui võtmeid -e, --expression, -f või --file ei kasutata, loetakse esimene argument, mis pole võti, sed skriptiks. Kõik järgnevad argumendid on sisendfailide nimed; kui sisendfaile ei antud, loetakse standardsisendit. --help väljast see abiinfo ja lõpeta töö --version väljasta versiooniinfo ja lõpeta töö --posix blokeeri kõik GNU laiendused. -R, --regexp-perl kasuta skriptis Perl 5 regulaaravaldiste süntaksit. -e skript, --expression=skript lisa täidetavate käskluste skript -f skripti-fail, --file=skripti-fail lisa skripti-faili sisu täidetavate käskluste hulka -i[SUFIKS], --in-place[=SUFIKS] toimeta faile (kui kasutati sifiksit, loob ka varukoopia) -l N, --line-length=N määra `l' käsule soovitatav rea pikkus -n, --quiet, --silent keela mustriruumi automaatne väljastamine -r, --regexp-extended kasuta skriptis laiendatud regulaaravaldiste süntaksit. -s, --separate käsitle faile ükshaaval, mitte ühe jätkuva voona. -u, --unbuffered loe sisendfailist minimaalne kogus andmeid ja tühjenda väljundpuhvreid sagedamini %s See on vaba tarkvara; kopeerimistingimused leiate lähtetekstidest. Garantii PUUDUB; ka müügiks või mingil eesmärgil kasutamiseks, vastavalt seadustega lubatud piiridele. %s: -e avaldis #%lu, sümbol %lu: %s %s: ei saa lugeda %s: %s %s: fail %s rida %lu: %s : ei vaja aadressePostitage teated vigadest: %s . Lisage kindlasti sõna ``%s'' ``Subject:'' reale. GNU sed versioon %s Kasutamine: %s [võti]... {ainult-skript-kui-teisi-skripte-pole} [sisend-fail]... käsku `e' ei toetata`}' ei vaja aadressepõhineb GNU sed versioonil %s ei leia märgendit, et hüpata kohale `%s'%s ei saa eemaldada: %s%s ei saa ümber nimetada: %smuudatusi tühjale regulaaravaldisele ei saa määratakäsk kasutab vaid üht aadressikommentaarid ei vaja aadresse%s ei saa toimetada: see on terminal%s ei saa toimetada: see ei ole tavaline failfaili %s ei saa avada: %sajutist faili %s ei saa avada: %s%d elemendi faili %s kirjutamine ebaõnnestus: %s%d elemendi faili %s kirjutamine ebaõnnestus: %seraldav sübol ei ole ühe-baidiline sümbolviga alamprotsessispeale `a', `c' või `i' peab olema \oodati sedi uuemat versioonilisasümbolid peale käskuvigane viide \%d käsu `s' paremas pooles+N või ~N ei või kasutada esimese aadressinavigane rea aadressi 0 kasutaminekäsk puudubkorduv `!'korduv `g' võti `s' käsuskorduv `p' võti `s' käsuskorduvad numbrivõtmed `s' käsuseelmist regulaaravaldist polenumbrivõti `s' käsus ei või olla nullvõtit `e' ei toetatalugemisviga %s: %ssõned käsus `y' on erineva pikkusegasuper-sed versioon %s ootamatu `,'ootamatu `}'tundmatu käsk: `%c'tundmatu võti `s' käsuleliigne `{'lõpetamata `s' käsklõpetamata `y' käsklõpetamata aadressi avaldissed-3.62/po/et.po0000644000076600007660000003422310176462001010543 00000000000000# Estonian translations for GNU sed. # Copyright (C) 2001 Free Software Foundation, Inc. # Toomas Soome , 2004. # msgid "" msgstr "" "Project-Id-Version: sed 4.1.1\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-07-09 16:33+0300\n" "Last-Translator: Toomas Soome \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-15\n" "Content-Transfer-Encoding: 8-bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "tundmatu võti `s' käsule" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "lugemisviga %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Vigane sümbolite klassi nimi" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "liigne `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "tundmatu võti `s' käsule" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "käsk puudub" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Regulaaravaldis on liiga suur" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "võtit `e' ei toetata" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Vigane \\{\\} sisu" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 msgid "multiple `!'s" msgstr "korduv `!'" #: sed/compile.c:163 msgid "unexpected `,'" msgstr "ootamatu `,'" #: sed/compile.c:164 msgid "invalid usage of +N or ~N as first address" msgstr "+N või ~N ei või kasutada esimese aadressina" #: sed/compile.c:165 msgid "unmatched `{'" msgstr "liigne `{'" #: sed/compile.c:166 msgid "unexpected `}'" msgstr "ootamatu `}'" #: sed/compile.c:167 msgid "extra characters after command" msgstr "lisasümbolid peale käsku" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "peale `a', `c' või `i' peab olema \\" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' ei vaja aadresse" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": ei vaja aadresse" #: sed/compile.c:171 msgid "comments don't accept any addresses" msgstr "kommentaarid ei vaja aadresse" #: sed/compile.c:172 msgid "missing command" msgstr "käsk puudub" #: sed/compile.c:173 msgid "command only uses one address" msgstr "käsk kasutab vaid üht aadressi" #: sed/compile.c:174 msgid "unterminated address regex" msgstr "lõpetamata aadressi avaldis" #: sed/compile.c:175 msgid "unterminated `s' command" msgstr "lõpetamata `s' käsk" #: sed/compile.c:176 msgid "unterminated `y' command" msgstr "lõpetamata `y' käsk" #: sed/compile.c:177 msgid "unknown option to `s'" msgstr "tundmatu võti `s' käsule" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "korduv `p' võti `s' käsus" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "korduv `g' võti `s' käsus" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "korduvad numbrivõtmed `s' käsus" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "numbrivõti `s' käsus ei või olla null" #: sed/compile.c:182 msgid "strings for `y' command are different lengths" msgstr "sõned käsus `y' on erineva pikkusega" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "eraldav sübol ei ole ühe-baidiline sümbol" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "oodati sedi uuemat versiooni" #: sed/compile.c:185 msgid "invalid usage of line address 0" msgstr "vigane rea aadressi 0 kasutamine" #: sed/compile.c:186 #, c-format msgid "unknown command: `%c'" msgstr "tundmatu käsk: `%c'" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: fail %s rida %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e avaldis #%lu, sümbol %lu: %s\n" #: sed/compile.c:1644 #, c-format msgid "can't find label for jump to `%s'" msgstr "ei leia märgendit, et hüpata kohale `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: ei saa lugeda %s: %s\n" #: sed/execute.c:672 #, c-format msgid "couldn't edit %s: is a terminal" msgstr "%s ei saa toimetada: see on terminal" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "%s ei saa toimetada: see ei ole tavaline fail" #: lib/utils.c:196 sed/execute.c:683 #, c-format msgid "couldn't open temporary file %s: %s" msgstr "ajutist faili %s ei saa avada: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "viga alamprotsessis" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "võtit `e' ei toetata" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "käsku `e' ei toetata" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "eelmist regulaaravaldist pole" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "muudatusi tühjale regulaaravaldisele ei saa määrata" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "vigane viide \\%d käsu `s' paremas pooles" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " kasuta skriptis Perl 5 regulaaravaldiste süntaksit.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" "Kasutamine: %s [võti]... {ainult-skript-kui-teisi-skripte-pole} [sisend-" "fail]...\n" "\n" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" " -n, --quiet, --silent\n" " keela mustriruumi automaatne väljastamine\n" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" " -e skript, --expression=skript\n" " lisa täidetavate käskluste skript\n" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" " -f skripti-fail, --file=skripti-fail\n" " lisa skripti-faili sisu täidetavate käskluste hulka\n" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" " -i[SUFIKS], --in-place[=SUFIKS]\n" " toimeta faile (kui kasutati sifiksit, loob ka varukoopia)\n" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" " -l N, --line-length=N\n" " määra `l' käsule soovitatav rea pikkus\n" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" " --posix\n" " blokeeri kõik GNU laiendused.\n" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -r, --regexp-extended\n" " kasuta skriptis laiendatud regulaaravaldiste süntaksit.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" " -s, --separate\n" " käsitle faile ükshaaval, mitte ühe jätkuva voona.\n" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" " -u, --unbuffered\n" " loe sisendfailist minimaalne kogus andmeid ja tühjenda\n" " väljundpuhvreid sagedamini\n" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr " --help väljast see abiinfo ja lõpeta töö\n" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr " --version väljasta versiooniinfo ja lõpeta töö\n" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" "\n" "Kui võtmeid -e, --expression, -f või --file ei kasutata, loetakse\n" "esimene argument, mis pole võti, sed skriptiks. Kõik järgnevad argumendid " "on\n" "sisendfailide nimed; kui sisendfaile ei antud, loetakse standardsisendit.\n" "\n" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Postitage teated vigadest: %s .\n" "Lisage kindlasti sõna ``%s'' ``Subject:'' reale.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed versioon %s\n" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "põhineb GNU sed versioonil %s\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versioon %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "See on vaba tarkvara; kopeerimistingimused leiate lähtetekstidest. Garantii\n" "PUUDUB; ka müügiks või mingil eesmärgil kasutamiseks, vastavalt seadustega\n" "lubatud piiridele.\n" #: lib/utils.c:98 lib/utils.c:336 #, c-format msgid "cannot remove %s: %s" msgstr "%s ei saa eemaldada: %s" #: lib/utils.c:143 #, c-format msgid "couldn't open file %s: %s" msgstr "faili %s ei saa avada: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "%d elemendi faili %s kirjutamine ebaõnnestus: %s" msgstr[1] "%d elemendi faili %s kirjutamine ebaõnnestus: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "lugemisviga %s: %s" #: lib/utils.c:341 #, c-format msgid "cannot rename %s: %s" msgstr "%s ei saa ümber nimetada: %s" #~ msgid "Success" #~ msgstr "Edukas" #~ msgid "No match" #~ msgstr "Ei leia" #~ msgid "Invalid regular expression" #~ msgstr "Vigane regulaaravaldis" #~ msgid "Invalid collation character" #~ msgstr "Vigane sortimise sümbol" #~ msgid "Trailing backslash" #~ msgstr "Lõpetav langkriips" #~ msgid "Invalid back reference" #~ msgstr "Vigane tagasi viide" #~ msgid "Unmatched [ or [^" #~ msgstr "Puudub [ või [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "Puudub ( või \\(" #~ msgid "Unmatched \\{" #~ msgstr "Puudub \\{" #~ msgid "Invalid range end" #~ msgstr "Vigane vahemiku lõpp" #~ msgid "Memory exhausted" #~ msgstr "Mälu on otsas" #~ msgid "Invalid preceding regular expression" #~ msgstr "Vigane eelnev regulaaravaldis" #~ msgid "Premature end of regular expression" #~ msgstr "Ootamatu regulaaravaldise lõpp" #~ msgid "Unmatched ) or \\)" #~ msgstr "Puudub ) või \\)" #~ msgid "No previous regular expression" #~ msgstr "Eelmist regulaaravaldist pole" sed-3.62/po/fi.gmo0000644000076600007660000000545510176462004010705 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^œt}Þ$n#“·Õfî U h ‚g  $ $ A$ f ‹4 ¬ á ü      -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed-4.0.8 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2003-12-07 09:35+0200 Last-Translator: Sami J. Laine Language-Team: Finnish MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=n != 1; -R, --regexp-perl käytä Perl 5:en mukaista säännöllisten lauseiden syntaksia skriptissä. %s Tämä ohjelma on vapaa ohjelmisto; tarkista jakeluehdot lähdekoodista. Tälle ohjelmalle ei anneta minkäänlaista takuuta; ei edes takuuta kaupallisesti hyväksyttävästä laadusta tai soveltuvuudesta tiettyyn tarkoitukseen. %s: -e lauseke #%lu, merkki %lu: %s %s: ei voida lukea syötettä %s: %s %s: tiedosto %s rivi %lu: %s : ei tarvitse osoitteitaLähetä virheraportit osoitteeseen %s . Sisällytä sana "%s" viestin aihekenttään ("Subject"-kenttään). GNU sed versio %s komento `e' ei ole tuettu"}" ei tarvitse osoitteita%d kohdetta ei voitu kirjoittaa tulosteeseen %s: %s%d kohdetta ei voitu kirjoittaa tulosteeseen %s: %svirhe lapsiprosessissaodotettiin uudempaa versiota sed:stäuseita "g"-valitsimia "s"-komennolleuseita "p"-valitsimia "s"-komennolleuseita valitsimia "s"-komennollenumeerinen valitsin "s"-komennolle ei voi olla nollavalitsin `e' ei ole tuettulukuvirhe syötteessä %s: %ssuper-sed versio %s sed-3.62/po/fi.po0000644000076600007660000003323710176462001010535 00000000000000# Finnish translations for GNU sed. # Copyright © 2002 Free Software Foundation, Inc. # Sami J. Laine , 2002 # msgid "" msgstr "" "Project-Id-Version: sed-4.0.8\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2003-12-07 09:35+0200\n" "Last-Translator: Sami J. Laine \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Tuntematon valitsin \"s\":lle" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "lukuvirhe syötteessä %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Virhellinen merkkiluokan nimi" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Pariton \"{\"" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Tuntematon valitsin \"s\":lle" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Puuttuva komento" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Säännöllinen lauseke on liian suuri" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "valitsin `e' ei ole tuettu" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Virheellinen sisältö \\{\\}:ssä" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Useita \"!\"-merkkejä" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Odottamaton \",\"" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Ensimmäisenä osoitteena ei voi olla +N tai ~N" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Pariton \"{\"" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Pariton \"}\"" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Ylimääräisiä merkkejä komennon jälkeen" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "\\ odotettiin merkkien `a', `c' tai `i' jälkeen" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "\"}\" ei tarvitse osoitteita" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": ei tarvitse osoitteita" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Kommentit eivät hyväksy osoitteita" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Puuttuva komento" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Komento käyttää vain yhtä osoitetta" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Päättymätön osoite vakiolauseessa" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Päättymätön \"s\"-komento" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Päättymätön \"y\"-komento" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Tuntematon valitsin \"s\":lle" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "useita \"p\"-valitsimia \"s\"-komennolle" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "useita \"g\"-valitsimia \"s\"-komennolle" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "useita valitsimia \"s\"-komennolle" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "numeerinen valitsin \"s\"-komennolle ei voi olla nolla" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "merkkijonot \"y\"-komennolle ovat pituudeltaan vaihtelevia" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "odotettiin uudempaa versiota sed:stä" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Komento käyttää vain yhtä osoitetta" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Tuntematon komento:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: tiedosto %s rivi %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e lauseke #%lu, merkki %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Nimikettä hypylle kohteeseen \"%s\" ei löydy" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: ei voida lukea syötettä %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Tiedostoa %s ei voitu avata: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Väliaikaistiedostoa %s ei voitu avata: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "virhe lapsiprosessissa" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "valitsin `e' ei ole tuettu" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "komento `e' ei ole tuettu" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Ei aikaisempaa säännöllistä lausetta" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Muuttajia ei voida määritellä tyhjään säännöliseen lausekkeeseen" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Virheellinen viittaus \\%d komennon `s' oikealla puolella" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " käytä Perl 5:en mukaista säännöllisten lauseiden\n" " syntaksia skriptissä.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " käytä Perl 5:en mukaista säännöllisten lauseiden\n" " syntaksia skriptissä.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Lähetä virheraportit osoitteeseen %s .\n" "Sisällytä sana \"%s\" viestin aihekenttään (\"Subject\"-kenttään).\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed versio %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "perustuu GNU sed versioon 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versio %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Tämä ohjelma on vapaa ohjelmisto; tarkista jakeluehdot lähdekoodista.\n" "Tälle ohjelmalle ei anneta minkäänlaista takuuta; ei edes takuuta\n" "kaupallisesti hyväksyttävästä laadusta tai soveltuvuudesta tiettyyn\n" "tarkoitukseen.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: ei voida lukea syötettä %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Tiedostoa %s ei voitu avata: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "%d kohdetta ei voitu kirjoittaa tulosteeseen %s: %s" msgstr[1] "%d kohdetta ei voitu kirjoittaa tulosteeseen %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "lukuvirhe syötteessä %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: ei voida lukea syötettä %s: %s\n" #~ msgid "Success" #~ msgstr "Onnistui" #~ msgid "No match" #~ msgstr "Ei osumaa" #~ msgid "Invalid regular expression" #~ msgstr "Virheellinen säännöllinen lauseke" #~ msgid "Invalid collation character" #~ msgstr "Virheellinen vertailumerkki" #~ msgid "Trailing backslash" #~ msgstr "Seuraava kenoviiva" #~ msgid "Invalid back reference" #~ msgstr "Virheellinen takaisinviittaus" #~ msgid "Unmatched [ or [^" #~ msgstr "Pariton \"[\" tai \"[^\"" #~ msgid "Unmatched ( or \\(" #~ msgstr "Pariton \"(\" tai \"\\(\"" #~ msgid "Unmatched \\{" #~ msgstr "Pariton \"\\{\"" #~ msgid "Invalid range end" #~ msgstr "Virheellinen välin loppu" #~ msgid "Memory exhausted" #~ msgstr "Muisti loppu" #~ msgid "Invalid preceding regular expression" #~ msgstr "Virheellinen edeltävä säännöllinen lauseke" #~ msgid "Premature end of regular expression" #~ msgstr "Ennenaikainen säännöllisen lausekkeen loppu" #~ msgid "Unmatched ) or \\)" #~ msgstr "Pariton \")\" tai \"\\)\"" #~ msgid "No previous regular expression" #~ msgstr "Ei aikaisempaa säännöllistä lausetta" sed-3.62/po/fr.gmo0000644000076600007660000002107010176462004010705 00000000000000•Þ?Y púq,l5™7Ï\`duÅl;b¨V Y b~ ¼ ;º Ë% † ¬ à Ýd ú _H s ¼ Ö õ!  5 J( _ ˆ# ¦ Ê$ ê#)BM2à ×ø*5*`‹« »#É#í&8,W„-²àö* @Ng€›&/BLrA¿c‘å˜wa‚òˆu¼þà»+œÈço#“\§#(H4gœ»JÙ$$+I'u8%Ö0üJ->x·Õ,õ%"<H7…,½ê ý' ' 3. [% Š7 ° è! E!&!l!‚ !‘!Ÿ!·!Ð!á!ø("20>3 ?, 91+$4:")7/.* 5#= -%< 6;&8('! If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. --help display this help and exit --version output version information and exit --posix disable all GNU extensions. -R, --regexp-perl use Perl 5's regular expressions syntax in the script. -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) -l N, --line-length=N specify the desired line-wrap length for the `l' command -n, --quiet, --silent suppress automatic printing of pattern space -r, --regexp-extended use extended regular expressions in the script. -s, --separate consider files as separate rather than as a single continuous long stream. -u, --unbuffered load minimal amounts of data from the input files and flush the output buffers more often %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]... `e' command not supported`}' doesn't want any addressesbased on GNU sed version %s can't find label for jump to `%s'cannot remove %s: %scannot rename %s: %scannot specify modifiers on empty regexpcommand only uses one addresscomments don't accept any addressescouldn't edit %s: is a terminalcouldn't edit %s: not a regular filecouldn't open file %s: %scouldn't open temporary file %s: %scouldn't write %d item to %s: %scouldn't write %d items to %s: %sdelimiter character is not a single-byte charactererror in subprocessexpected \ after `a', `c' or `i'expected newer version of sedextra characters after commandinvalid reference \%d on `s' command's RHSinvalid usage of +N or ~N as first addressinvalid usage of line address 0missing commandmultiple `!'smultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandno previous regular expressionnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %sstrings for `y' command are different lengthssuper-sed version %s unexpected `,'unexpected `}'unknown command: `%c'unknown option to `s'unmatched `{'unterminated `s' commandunterminated `y' commandunterminated address regexProject-Id-Version: sed 4.1.1 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-07-12 00:09+0200 Last-Translator: Gaël Quéri Language-Team: French MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8-bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=(n > 1); Si aucune option -e, --expression, -f ou --file n'est donnée, le premier argument qui n'est pas une option sera pris comme étant le script sed à interpréter. Tous les arguments restants sont les noms des fichiers d'entrée; si aucun fichier d'entrée n'est spécifiée, l'entrée standard est lue. --help afficher cette aide et sortir --version afficher les informations de version du logiciel et sortir --posix désactiver toutes les extensions GNU. -R, --regexp-perl utiliser la syntaxe des expressions régulières de Perl 5 dans le script. -e script, --expression=script ajouter le script aux commandes à être exécutées -f fichier-script, --file=fichier-script ajouter le contenu de fichier-script aux commandes à être exécutées -i[SUFFIXE], --in-place[=SUFFIXE] éditer les fichiers à leur place (fait une sauvegarde si l'extension est fournie) -l N, --line-length=N spécifier la longueur de coupure de ligne désirée pour la commande `l' -n, --quiet, --silent supprimer l'écriture automatique de l'espace des motifs -r, --regexp-extended utiliser la syntaxe des expressions régulières étendues dans le script. -s, --separate considérer les fichiers comme séparés plutôt que comme un simple flux long et continu. -u, --unbuffered charger des quantités minimales de données depuis les fichiers d'entrée et libérer les tampons de sortie plus souvent %s Ce logiciel est libre; voir les sources pour les conditions de reproduction. AUCUNE garantie n'est donnée; y compris pour des RAISONS COMMERCIALES ou pour RÉPONDRE A UN BESOIN PARTICULIER, à l'étendue permise par la loi. %s: -e expression n°%lu, caractère %lu: %s %s: impossible de lire %s: %s %s: fichier %s ligne %lu: %s : n'a besoin d'aucune adresseRapporter toutes anomalies à: %s. N'oubliez pas d'inclure le mot ``%s'' quelque-part dans la zone ``Subject:'' GNU sed version %s Utilisation: %s [OPTION]... {script-seulement-si-pas-d'autre-script} [fichier-d'entrée]... la commande `e' n'est pas supportée`}' n'a besoin d'aucune adressefondé sur GNU sed version %s impossible de trouver l'étiquette pour sauter à `%s'impossible de supprimer %s: %simpossible de renommer %s: %simpossible de spécifier des modifieurs sur une expression rationnelle videla commande n'utilise qu'une adresseles commentaires n'acceptent aucune adresseimpossible d'éditer %s: est un terminalimpossible d'éditer %s: ce n'est pas un fichier régulierimpossible d'ouvrir le fichier %s: %simpossible d'ouvrir le fichier temporaire %s: %simpossible d'écrire %d item à %s: %simpossible d'écrire %d items à %s: %sle caractère délimiteur n'est pas un caractère à un seul octeterreur dans le sous-processus\ attendu après `a', `c' ou `i'une version plus récente de sed est attenduecaractères inutiles après la commanderéférence \%d invalide dans le côté droit de la commande `s'utilisation invalide de +N ou ~N comme première adresseutilisation invalide de l'adresse de ligne 0commande manquante`!' multiplesplusieurs options `g' à la commande `s'plusieurs options `p' à la commande `s'plusieurs options numériques à la commande `s'pas d'expression régulière précédentel'option numérique de la comande `s' ne peut être nullel'option `e' n'est pas supportéeerreur de lecture sur %s: %sles chaînes destinées à la commande `y' ont des longueurs différentessuper-sed version %s `,' inattendue`}' inattenducommande inconnue: `%c'option inconnue pour `s'`{' non referméecommande `s' inachevéecommande `y' inachevéeexpression régulière d'adresse inachevéesed-3.62/po/fr.po0000644000076600007660000003665510176462001010555 00000000000000# French translation of GNU sed. # Copyright (C) 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. # Gaël Quéri , 1998. # # J'ai préféré utiliser le terme <> plutôt # qu'<> car celui-là est moins déroutant # pour ceux qui sont habitués à la formulation anglaise # msgid "" msgstr "" "Project-Id-Version: sed 4.1.1\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-07-12 00:09+0200\n" "Last-Translator: Gaël Quéri \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8-bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "option inconnue pour `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "erreur de lecture sur %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Nom de classe de caractères invalide" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "`{' non refermée" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "option inconnue pour `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "commande manquante" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Expression régulière trop grande" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "l'option `e' n'est pas supportée" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Contenu de \\{\\} invalide" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 msgid "multiple `!'s" msgstr "`!' multiples" #: sed/compile.c:163 msgid "unexpected `,'" msgstr "`,' inattendue" #: sed/compile.c:164 msgid "invalid usage of +N or ~N as first address" msgstr "utilisation invalide de +N ou ~N comme première adresse" #: sed/compile.c:165 msgid "unmatched `{'" msgstr "`{' non refermée" #: sed/compile.c:166 msgid "unexpected `}'" msgstr "`}' inattendu" #: sed/compile.c:167 msgid "extra characters after command" msgstr "caractères inutiles après la commande" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "\\ attendu après `a', `c' ou `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' n'a besoin d'aucune adresse" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": n'a besoin d'aucune adresse" #: sed/compile.c:171 msgid "comments don't accept any addresses" msgstr "les commentaires n'acceptent aucune adresse" #: sed/compile.c:172 msgid "missing command" msgstr "commande manquante" #: sed/compile.c:173 msgid "command only uses one address" msgstr "la commande n'utilise qu'une adresse" #: sed/compile.c:174 msgid "unterminated address regex" msgstr "expression régulière d'adresse inachevée" #: sed/compile.c:175 msgid "unterminated `s' command" msgstr "commande `s' inachevée" #: sed/compile.c:176 msgid "unterminated `y' command" msgstr "commande `y' inachevée" #: sed/compile.c:177 msgid "unknown option to `s'" msgstr "option inconnue pour `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "plusieurs options `p' à la commande `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "plusieurs options `g' à la commande `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "plusieurs options numériques à la commande `s'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "l'option numérique de la comande `s' ne peut être nulle" #: sed/compile.c:182 msgid "strings for `y' command are different lengths" msgstr "les chaînes destinées à la commande `y' ont des longueurs différentes" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "le caractère délimiteur n'est pas un caractère à un seul octet" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "une version plus récente de sed est attendue" #: sed/compile.c:185 msgid "invalid usage of line address 0" msgstr "utilisation invalide de l'adresse de ligne 0" #: sed/compile.c:186 #, c-format msgid "unknown command: `%c'" msgstr "commande inconnue: `%c'" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: fichier %s ligne %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e expression n°%lu, caractère %lu: %s\n" #: sed/compile.c:1644 #, c-format msgid "can't find label for jump to `%s'" msgstr "impossible de trouver l'étiquette pour sauter à `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: impossible de lire %s: %s\n" #: sed/execute.c:672 #, c-format msgid "couldn't edit %s: is a terminal" msgstr "impossible d'éditer %s: est un terminal" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "impossible d'éditer %s: ce n'est pas un fichier régulier" #: lib/utils.c:196 sed/execute.c:683 #, c-format msgid "couldn't open temporary file %s: %s" msgstr "impossible d'ouvrir le fichier temporaire %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "erreur dans le sous-processus" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "l'option `e' n'est pas supportée" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "la commande `e' n'est pas supportée" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "pas d'expression régulière précédente" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "" "impossible de spécifier des modifieurs sur une expression\n" "rationnelle vide" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "référence \\%d invalide dans le côté droit de la commande `s'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " utiliser la syntaxe des expressions régulières\n" " de Perl 5 dans le script.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" "Utilisation: %s [OPTION]... {script-seulement-si-pas-d'autre-script}\n" "[fichier-d'entrée]...\n" "\n" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" " -n, --quiet, --silent\n" " supprimer l'écriture automatique de l'espace des motifs\n" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" " -e script, --expression=script\n" " ajouter le script aux commandes à être exécutées\n" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" " -f fichier-script, --file=fichier-script\n" " ajouter le contenu de fichier-script aux commandes\n" " à être exécutées\n" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" " -i[SUFFIXE], --in-place[=SUFFIXE]\n" " éditer les fichiers à leur place (fait une\n" " sauvegarde si l'extension est fournie)\n" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" " -l N, --line-length=N\n" " spécifier la longueur de coupure de ligne désirée pour la\n" " commande `l'\n" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" " --posix\n" " désactiver toutes les extensions GNU.\n" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -r, --regexp-extended\n" " utiliser la syntaxe des expressions régulières\n" " étendues dans le script.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" " -s, --separate\n" " considérer les fichiers comme séparés plutôt que comme un\n" " simple flux long et continu.\n" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" " -u, --unbuffered\n" " charger des quantités minimales de données depuis les\n" " fichiers d'entrée et libérer les tampons de sortie plus\n" " souvent\n" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr " --help afficher cette aide et sortir\n" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" " --version afficher les informations de version du logiciel et sortir\n" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" "\n" "Si aucune option -e, --expression, -f ou --file n'est donnée, le\n" "premier argument qui n'est pas une option sera pris comme étant le script\n" "sed à interpréter. Tous les arguments restants sont les noms des fichiers\n" "d'entrée; si aucun fichier d'entrée n'est spécifiée, l'entrée standard\n" "est lue.\n" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Rapporter toutes anomalies à: %s.\n" "N'oubliez pas d'inclure le mot ``%s'' quelque-part dans la zone " "``Subject:''\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed version %s\n" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "fondé sur GNU sed version %s\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed version %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Ce logiciel est libre; voir les sources pour les conditions de " "reproduction.\n" "AUCUNE garantie n'est donnée; y compris pour des RAISONS COMMERCIALES ou\n" "pour RÉPONDRE A UN BESOIN PARTICULIER, à l'étendue permise par la loi.\n" #: lib/utils.c:98 lib/utils.c:336 #, c-format msgid "cannot remove %s: %s" msgstr "impossible de supprimer %s: %s" #: lib/utils.c:143 #, c-format msgid "couldn't open file %s: %s" msgstr "impossible d'ouvrir le fichier %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "impossible d'écrire %d item à %s: %s" msgstr[1] "impossible d'écrire %d items à %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "erreur de lecture sur %s: %s" #: lib/utils.c:341 #, c-format msgid "cannot rename %s: %s" msgstr "impossible de renommer %s: %s" #~ msgid "Success" #~ msgstr "Succès" #~ msgid "No match" #~ msgstr "Pas de concordance" #~ msgid "Invalid regular expression" #~ msgstr "Expression régulière invalide" #~ msgid "Invalid collation character" #~ msgstr "Caractère de collation invalide" #~ msgid "Trailing backslash" #~ msgstr "Antislash de protection" #~ msgid "Invalid back reference" #~ msgstr "Référence arrière invalide" #~ msgid "Unmatched [ or [^" #~ msgstr "[ ou [^ non refermé" #~ msgid "Unmatched ( or \\(" #~ msgstr "( ou \\( non refermé" #~ msgid "Unmatched \\{" #~ msgstr "\\{ non refermé" #~ msgid "Invalid range end" #~ msgstr "Fin d'intervalle invalide" #~ msgid "Memory exhausted" #~ msgstr "Mémoire épuisée" #~ msgid "Invalid preceding regular expression" #~ msgstr "L'expression régulière précédente est invalide" #~ msgid "Premature end of regular expression" #~ msgstr "Fin prématurée d'une expression régulière" #~ msgid "Unmatched ) or \\)" #~ msgstr ") ou \\) non refermé" #~ msgid "No previous regular expression" #~ msgstr "Pas d'expression régulière précédente" sed-3.62/po/ga.gmo0000644000076600007660000002034110176462004010665 00000000000000•Þ?Y púq,l5™7Ï\`duÅl;b¨V Y b~ ¼ ;º Ë% † ¬ à Ýd ú _H s ¼ Ö õ!  5 J( _ ˆ# ¦ Ê$ ê#)BM2à ×ø*5*`‹« »#É#í&8,W„-²àö* @Ng€¯›óK:?=z>¸V÷[Ntªš\ºVZnZÉŒ$è± š»Ùõf|F×ñ (2[x0–)Ç)ñ23N)‚3¬£à(„­0Æ*÷%")H/r#¢Æ×%é%+5$a:†ÁÚ2ò % ; K [ p Ž — ® Å20>3 ?, 91+$4:")7/.* 5#= -%< 6;&8('! If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. --help display this help and exit --version output version information and exit --posix disable all GNU extensions. -R, --regexp-perl use Perl 5's regular expressions syntax in the script. -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) -l N, --line-length=N specify the desired line-wrap length for the `l' command -n, --quiet, --silent suppress automatic printing of pattern space -r, --regexp-extended use extended regular expressions in the script. -s, --separate consider files as separate rather than as a single continuous long stream. -u, --unbuffered load minimal amounts of data from the input files and flush the output buffers more often %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]... `e' command not supported`}' doesn't want any addressesbased on GNU sed version %s can't find label for jump to `%s'cannot remove %s: %scannot rename %s: %scannot specify modifiers on empty regexpcommand only uses one addresscomments don't accept any addressescouldn't edit %s: is a terminalcouldn't edit %s: not a regular filecouldn't open file %s: %scouldn't open temporary file %s: %scouldn't write %d item to %s: %scouldn't write %d items to %s: %sdelimiter character is not a single-byte charactererror in subprocessexpected \ after `a', `c' or `i'expected newer version of sedextra characters after commandinvalid reference \%d on `s' command's RHSinvalid usage of +N or ~N as first addressinvalid usage of line address 0missing commandmultiple `!'smultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandno previous regular expressionnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %sstrings for `y' command are different lengthssuper-sed version %s unexpected `,'unexpected `}'unknown command: `%c'unknown option to `s'unmatched `{'unterminated `s' commandunterminated `y' commandunterminated address regexProject-Id-Version: sed 4.1.1 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-07-07 11:04-0500 Last-Translator: Kevin Patrick Scannell Language-Team: Irish MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=4; plural=n==1 ? 0 : (n>1 && n<7) ? 1 : (n>6 && n <11) ? 2 : 3; Mura bhfuil rogha -e, --expression, -f, nó --file ann, glacfar an chéad argóint nach raibh ina rogha mar an script `sed' a léirmhíniú. Tá gach argóint eile an t-ainm de comhad ionchuir; mura bhfuil comhad ann léigh ón ionchur caighdeánach. --help taispeáin an chabhair seo agus éirigh as --version taispeáin eolas faoin leagan agus éirigh as --posix díchumasaigh gach feabhsúchán GNU. -R, --regexp-perl bain úsáid as sloinn ionadaíochta atá ag Perl 5. -e script, --expression=script cuir an script leis na horduithe le rith -f comhad-script, --file=comhad-script cuir na línte i `comhad-script' leis na horduithe le rith -i[IARMHÍR], --in-place[=IARMHÍR] cuir eagar ar comhaid san áit a bhfuil siad (agus déan cúltaca má tá IARMHÍR tugtha -l N, --line-length=N ceap an fad timfhillte le haghaidh an ordaithe `l' -n, --quiet, --silent stop priontáil uathoibríoch den spás patrúin -r, --regexp-extended úsáid sloinn ionadaíochta feabhsaithe sa script. -s, --separate féach ar comhaid ina leith seachas mar sruth leanúnach. -u, --unbuffered lódáil cantaí beaga ó na comhaid ionchur agus sruthlaigh na maoláin aschur níos minice %s Is saorbhogearra an ríomhchlár seo; féach ar an bhunchód le haghaidh coinníollacha cóipeála. Níl baránta AR BITH ann; go fiú níl baránta ann d'INDÍOLTACHT nó FEILIÚNACHT DO FHEIDHM AR LEITH, an oiread atá ceadaithe de réir dlí. %s: -e slonn #%lu, char %lu: %s %s: ní féidir %s a léamh: %s %s: comhad %s líne %lu: %s Níl fáilte roimh seoltaí le `:'Seol tuairiscí fabhtanna chuig: %s . Cuir an focal ``%s'' áit éigin sa líne ``Subject:'' le do thoil. GNU sed, leagan %s Úsáid: %s [ROGHA]... {script-mura-bhfuil-script-eile} [inchomhad]... níl an t-ordú `e' ar fáilNíl fáilte roimh seoltaí le `}'bunaithe ar GNU sed, leagan %s níl aon fháil ar an lipéad `%s' don léimní féidir %s a scriosadh: %sní féidir %s a athainmniú: %sní féidir bunathraitheoirí a shonrú le slonn bánní úsáidtear an t-ordú ach seoladh amháinníl fáilte roimh seoltaí le nótaí tráchtaníorbh fhéidir %s a chur in eagar; is teirminéal éníorbh fhéidir %s a chur in eagar: ní gnáthcomhad éníorbh fhéidir an comhad %s a oscailt: %sníorbh fhéidir an comhad sealadach %s a oscailt: %sníorbh fhéidir %d rud a scríobh i %s: %sníorbh fhéidir %d rud a scríobh i %s: %sníorbh fhéidir %d rud a scríobh i %s: %sníorbh fhéidir %d rud a scríobh i %s: %stá an teorantóir ina charachtar ilbheartearráid i bhfo-phróiseasbhíothas ag súil le \ i ndiaidh `a', `c', nó `i'bhíothas ag súil le leagan `sed' níos úirecarachtair breise i ndiaidh an t-ordútagairt neamhbhailí \%d ar dheis ordú `s'ní féidir +N nó ~N a úsáid mar an chéad seoladhní féidir an seoladh líne 0 a úsáidordú ar iarraidh`!'-anna iomadúlaan iomarca roghanna `g' i ndiaidh `s'an iomarca roghanna `p' i ndiaidh `s'an iomarca roghanna uimhriúla i ndiaidh `s'níl aon slonn ionadaíochta roimh seoní cheadaítear nialas mar rogha uimhriúil leis an ordú `s'níl an rogha `e' ar fáilearráid ag léamh %s: %sní aon fad amháin ar na teaghráin leis an ordú `y'super-sed, leagan %s `,' gan choinne`}' gan choinneordú anaithnid: `%c'rogha anaithnid i ndiaidh `s'`{' corrordú `s' gan chríochnúordú `y' gan chríochnúseoladh regex gan chríochnúsed-3.62/po/ga.po0000644000076600007660000003621110176462001010521 00000000000000# Irish translations for sed # Copyright (C) 2003, 2004 Free Software Foundation, Inc. # Kevin Patrick Scannell , 2003, 2004. # msgid "" msgstr "" "Project-Id-Version: sed 4.1.1\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-07-07 11:04-0500\n" "Last-Translator: Kevin Patrick Scannell \n" "Language-Team: Irish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=4; plural=n==1 ? 0 : (n>1 && n<7) ? 1 : (n>6 && n " "<11) ? 2 : 3;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "rogha anaithnid i ndiaidh `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "earráid ag léamh %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Aicme charachtair neamhbhailí" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "`{' corr" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "rogha anaithnid i ndiaidh `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "ordú ar iarraidh" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Slonn ionadaíochta rómhór" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "níl an rogha `e' ar fáil" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Ábhar neamhbhailí idir \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 msgid "multiple `!'s" msgstr "`!'-anna iomadúla" #: sed/compile.c:163 msgid "unexpected `,'" msgstr "`,' gan choinne" #: sed/compile.c:164 msgid "invalid usage of +N or ~N as first address" msgstr "ní féidir +N nó ~N a úsáid mar an chéad seoladh" #: sed/compile.c:165 msgid "unmatched `{'" msgstr "`{' corr" #: sed/compile.c:166 msgid "unexpected `}'" msgstr "`}' gan choinne" #: sed/compile.c:167 msgid "extra characters after command" msgstr "carachtair breise i ndiaidh an t-ordú" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "bhíothas ag súil le \\ i ndiaidh `a', `c', nó `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "Níl fáilte roimh seoltaí le `}'" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr "Níl fáilte roimh seoltaí le `:'" #: sed/compile.c:171 msgid "comments don't accept any addresses" msgstr "níl fáilte roimh seoltaí le nótaí tráchta" #: sed/compile.c:172 msgid "missing command" msgstr "ordú ar iarraidh" #: sed/compile.c:173 msgid "command only uses one address" msgstr "ní úsáidtear an t-ordú ach seoladh amháin" #: sed/compile.c:174 msgid "unterminated address regex" msgstr "seoladh regex gan chríochnú" #: sed/compile.c:175 msgid "unterminated `s' command" msgstr "ordú `s' gan chríochnú" #: sed/compile.c:176 msgid "unterminated `y' command" msgstr "ordú `y' gan chríochnú" #: sed/compile.c:177 msgid "unknown option to `s'" msgstr "rogha anaithnid i ndiaidh `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "an iomarca roghanna `p' i ndiaidh `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "an iomarca roghanna `g' i ndiaidh `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "an iomarca roghanna uimhriúla i ndiaidh `s'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "ní cheadaítear nialas mar rogha uimhriúil leis an ordú `s'" #: sed/compile.c:182 msgid "strings for `y' command are different lengths" msgstr "ní aon fad amháin ar na teaghráin leis an ordú `y'" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "tá an teorantóir ina charachtar ilbheart" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "bhíothas ag súil le leagan `sed' níos úire" #: sed/compile.c:185 msgid "invalid usage of line address 0" msgstr "ní féidir an seoladh líne 0 a úsáid" #: sed/compile.c:186 #, c-format msgid "unknown command: `%c'" msgstr "ordú anaithnid: `%c'" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: comhad %s líne %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e slonn #%lu, char %lu: %s\n" #: sed/compile.c:1644 #, c-format msgid "can't find label for jump to `%s'" msgstr "níl aon fháil ar an lipéad `%s' don léim" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: ní féidir %s a léamh: %s\n" # Irish is nice this way, no initial mutation on 'rud'! -- KPS # Include all three b/c I'm using template version of "Plural-Forms" #: sed/execute.c:672 #, c-format msgid "couldn't edit %s: is a terminal" msgstr "níorbh fhéidir %s a chur in eagar; is teirminéal é" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "níorbh fhéidir %s a chur in eagar: ní gnáthcomhad é" #: lib/utils.c:196 sed/execute.c:683 #, c-format msgid "couldn't open temporary file %s: %s" msgstr "níorbh fhéidir an comhad sealadach %s a oscailt: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "earráid i bhfo-phróiseas" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "níl an rogha `e' ar fáil" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "níl an t-ordú `e' ar fáil" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "níl aon slonn ionadaíochta roimh seo" # bunathraitheoir is in FARF - KPS #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "ní féidir bunathraitheoirí a shonrú le slonn bán" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "tagairt neamhbhailí \\%d ar dheis ordú `s'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " bain úsáid as sloinn ionadaíochta atá ag Perl 5.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" "Úsáid: %s [ROGHA]... {script-mura-bhfuil-script-eile} [inchomhad]...\n" "\n" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" " -n, --quiet, --silent\n" " stop priontáil uathoibríoch den spás patrúin\n" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" " -e script, --expression=script\n" " cuir an script leis na horduithe le rith\n" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" " -f comhad-script, --file=comhad-script\n" " cuir na línte i `comhad-script' leis na horduithe le rith\n" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" " -i[IARMHÍR], --in-place[=IARMHÍR]\n" " cuir eagar ar comhaid san áit a bhfuil siad (agus déan\n" " cúltaca má tá IARMHÍR tugtha\n" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" " -l N, --line-length=N\n" " ceap an fad timfhillte le haghaidh an ordaithe `l'\n" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" " --posix\n" " díchumasaigh gach feabhsúchán GNU.\n" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -r, --regexp-extended\n" " úsáid sloinn ionadaíochta feabhsaithe sa script.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" " -s, --separate\n" " féach ar comhaid ina leith seachas mar sruth leanúnach.\n" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" " -u, --unbuffered\n" " lódáil cantaí beaga ó na comhaid ionchur agus sruthlaigh\n" " na maoláin aschur níos minice\n" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr " --help taispeáin an chabhair seo agus éirigh as\n" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr " --version taispeáin eolas faoin leagan agus éirigh as\n" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" "\n" "Mura bhfuil rogha -e, --expression, -f, nó --file ann, glacfar an chéad\n" "argóint nach raibh ina rogha mar an script `sed' a léirmhíniú. Tá gach\n" "argóint eile an t-ainm de comhad ionchuir; mura bhfuil comhad ann\n" "léigh ón ionchur caighdeánach.\n" "\n" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Seol tuairiscí fabhtanna chuig: %s .\n" "Cuir an focal ``%s'' áit éigin sa líne ``Subject:'' le do thoil.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed, leagan %s\n" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "bunaithe ar GNU sed, leagan %s\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed, leagan %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Is saorbhogearra an ríomhchlár seo; féach ar an bhunchód le haghaidh\n" "coinníollacha cóipeála. Níl baránta AR BITH ann; go fiú níl baránta ann\n" "d'INDÍOLTACHT nó FEILIÚNACHT DO FHEIDHM AR LEITH, an oiread atá ceadaithe\n" "de réir dlí.\n" #: lib/utils.c:98 lib/utils.c:336 #, c-format msgid "cannot remove %s: %s" msgstr "ní féidir %s a scriosadh: %s" #: lib/utils.c:143 #, c-format msgid "couldn't open file %s: %s" msgstr "níorbh fhéidir an comhad %s a oscailt: %s" # Irish is nice this way, no initial mutation on 'rud'! -- KPS # Include all three b/c I'm using template version of "Plural-Forms" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "níorbh fhéidir %d rud a scríobh i %s: %s" msgstr[1] "níorbh fhéidir %d rud a scríobh i %s: %s" msgstr[2] "níorbh fhéidir %d rud a scríobh i %s: %s" msgstr[3] "níorbh fhéidir %d rud a scríobh i %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "earráid ag léamh %s: %s" #: lib/utils.c:341 #, c-format msgid "cannot rename %s: %s" msgstr "ní féidir %s a athainmniú: %s" #~ msgid "Success" #~ msgstr "Bua!" #~ msgid "No match" #~ msgstr "Níl a leithéid ann" #~ msgid "Invalid regular expression" #~ msgstr "Slonn ionadaíochta neamhbhailí" #~ msgid "Invalid collation character" #~ msgstr "Carachtar cóimheasa neamhbhailí" #~ msgid "Trailing backslash" #~ msgstr "Cúlslais ag deireadh" # coinage - KPS #~ msgid "Invalid back reference" #~ msgstr "Cúltagairt neamhbhailí" #~ msgid "Unmatched [ or [^" #~ msgstr "[ nó [^ corr" #~ msgid "Unmatched ( or \\(" #~ msgstr "( nó \\( corr" #~ msgid "Unmatched \\{" #~ msgstr "\\{ corr" #~ msgid "Invalid range end" #~ msgstr "Deireadh raoin neamhbhailí" #~ msgid "Memory exhausted" #~ msgstr "Cuimhne ídithe" #~ msgid "Invalid preceding regular expression" #~ msgstr "Is neamhbhailí an slonn ionadaíochta roimh seo" #~ msgid "Premature end of regular expression" #~ msgstr "Deireadh le slonn ionadaíochta gan choinne" #~ msgid "Unmatched ) or \\)" #~ msgstr ") nó \\) corr" #~ msgid "No previous regular expression" #~ msgstr "Níl aon slonn ionadaíochta roimh seo" sed-3.62/po/gl.gmo0000644000076600007660000000540410176462004010703 00000000000000•Þ¼\Ð\Ѻ.%é&@d]ÂÖðBR#f#Š&®,Õ0–Faݹ?(ù"?]³v * > _[ z Ö, é, 2 C= v ´ Ô î     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2002-10-25 15:57+0200 Last-Translator: Jacobo Tarrío Barreiro Language-Team: Galician MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=n!=1; -R, --regexp-perl usa-la sintaxe de expresións regulares de Perl 5 no script. %s Isto é software libre; vexa o código fonte polas condicións de copia. NON hai garantía; nin sequera de COMERCIABILIDADE ou APTITUDE PARA UN FIN DETERMINADO, ata o que permite a lei. %s: -e expresión #%lu, carácter %lu: %s %s: non se puido ler %s: %s %s: ficheiro %s liña %lu: %s : non acepta un enderezoInforme dos erros no programa a %s . Informe dos erros na traducción a gpul-traduccion@ceu.fi.udc.es . Asegúrese de incluí-la palabra ``%s'' nalgunha parte do campo ``Subject:''. GNU sed versión %s o comando `e' non está soportado`}' non acepta un enderezonon se puido escribir %d elemento en %s: %snon se puideron escribir %d elementos en %s: %serro no subprocesomúltiples opcións `g' para a instrucción `s'múltiples opcións `p' para a instrucción `s'múltiples opcións numéricas para a instrucción `s'unha opción numérica para a instrucción `s' non pode ser ceroa opción `e' non está soportadaerro de lectura en %s: %ssuper-sed versión %s sed-3.62/po/gl.po0000644000076600007660000003324410176462002010540 00000000000000# Galician translation of GNU sed # Copyright (C) 1999, 2002 Free Software Foundation, Inc. # Jacobo Tarrío Barreiro , 1999, 2002. # msgid "" msgstr "" "Project-Id-Version: sed 4.0\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2002-10-25 15:57+0200\n" "Last-Translator: Jacobo Tarrío Barreiro \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=n!=1;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Opción de `s' descoñecida" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "erro de lectura en %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Nome de clase de caracteres non válido" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "`{' sen parella" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Opción de `s' descoñecida" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Falta unha instrucción" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Expresión regular grande de máis" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "a opción `e' non está soportada" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Contido de \\{\\} non válido" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Múltiples `!'s" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "`,' inesperada" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Non se pode usar +N ou ~N como primeira dirección" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "`{' sen parella" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "`}' inesperado" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Caracteres extra despois da instrucción" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Esperábase \\ despois de `a', `c' ou `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' non acepta un enderezo" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": non acepta un enderezo" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Os comentarios non aceptan enderezos" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Falta unha instrucción" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "A instrucción só usa un enderezo" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Expresión regular de enderezo non rematada" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Instrucción `s' non rematada" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Instrucción `y' non rematada" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Opción de `s' descoñecida" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "múltiples opcións `p' para a instrucción `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "múltiples opcións `g' para a instrucción `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "múltiples opcións numéricas para a instrucción `s'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "unha opción numérica para a instrucción `s' non pode ser cero" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "as cadeas para a instrucción y teñen lonxitudes diferentes" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Uso non válido de modificador de dirección" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Instrucción descoñecida:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: ficheiro %s liña %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e expresión #%lu, carácter %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Non se puido atopa-la etiqueta para saltar a `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: non se puido ler %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Non se puido abri-lo ficheiro %s: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Non se puido abri-lo ficheiro %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "erro no subproceso" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "a opción `e' non está soportada" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "o comando `e' non está soportado" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Non hai unha expresión regular anterior" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Non se poden especificar modificadores nunha expresión regular baleira" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Referencia \\%d non válida no lado dereito do comando `s'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " usa-la sintaxe de expresións regulares de Perl 5 no " "script.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " usa-la sintaxe de expresións regulares de Perl 5 no " "script.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Informe dos erros no programa a %s .\n" "Informe dos erros na traducción a gpul-traduccion@ceu.fi.udc.es .\n" "Asegúrese de incluí-la palabra ``%s'' nalgunha parte do campo ``Subject:''.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed versión %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "baseado en GNU sed versión 3.02.80\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versión %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Isto é software libre; vexa o código fonte polas condicións de copia. NON " "hai\n" "garantía; nin sequera de COMERCIABILIDADE ou APTITUDE PARA UN FIN " "DETERMINADO,\n" "ata o que permite a lei.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: non se puido ler %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Non se puido abri-lo ficheiro %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "non se puido escribir %d elemento en %s: %s" msgstr[1] "non se puideron escribir %d elementos en %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "erro de lectura en %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: non se puido ler %s: %s\n" #~ msgid "Success" #~ msgstr "Éxito" #~ msgid "No match" #~ msgstr "Non se atopou" #~ msgid "Invalid regular expression" #~ msgstr "Expresión regular non válida" #~ msgid "Invalid collation character" #~ msgstr "Carácter de ordeamento non válido" #~ msgid "Trailing backslash" #~ msgstr "Barra invertida á fin de liña" #~ msgid "Invalid back reference" #~ msgstr "Referencia cara a atrás non válida" #~ msgid "Unmatched [ or [^" #~ msgstr "[ ou [^ sen parella" #~ msgid "Unmatched ( or \\(" #~ msgstr "( ou \\( sen parella" #~ msgid "Unmatched \\{" #~ msgstr "\\{ sen parella" #~ msgid "Invalid range end" #~ msgstr "Fin de rango non válida" #~ msgid "Memory exhausted" #~ msgstr "Memoria esgotada" #~ msgid "Invalid preceding regular expression" #~ msgstr "Expresión regular anterior non válida" #~ msgid "Premature end of regular expression" #~ msgstr "Fin prematura da expresión regular" #~ msgid "Unmatched ) or \\)" #~ msgstr ") ou \\) sen parella" #~ msgid "No previous regular expression" #~ msgstr "Non hai unha expresión regular anterior" sed-3.62/po/he.gmo0000644000076600007660000000360410176462004010675 00000000000000•Þ „ì0º1%ì)Cd`Å#ä#&,,S€R•äè4Í)"Lt_Ôé%+Dp    %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. `}' doesn't want any addressesmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zeroread error on %s: %sProject-Id-Version: sed 3.02.80 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2001-08-04 20:37+0300 Last-Translator: Eli Zaretskii Language-Team: Hebrew MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-8 Content-Transfer-Encoding: 8-bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: %s äååìî äðéà úéðëúä .øå÷îä éöá÷ úà äàø ,èåøéô øúéì ;úéùôç äðëú äðéä åæ úéðëú äãéîá úàæå ,àéäù úéìëú åæéàì äîàúä åà úåøéçñ íùì àì åìéôà ;úåéøçà áúëá .úàæ øùôàî ÷åçäù %s úéðëúá (%lu 'ñî -e éåèéá ìù %lu 'ñî åú) %s äàéâù %s úéðëúá %s úàéø÷á (%s) äàéâù %s úéðëúá (%s õáå÷ ìù %lu äøåù) %s äàéâù úåáåúë ìá÷î åðéà : .%s úáåúëì (bugs) äì÷ú éçååéã çåìùì àð .(``Subject'') ``ïåãðä'' úøåùá ``%s'' äìéî ìåìëì åãéô÷ä àðà úåáåúë ìá÷î åðéà `}'`s' äãå÷ôì íéáåøî `g' éðééôàî`s' äãå÷ôì íéáåøî `p' éðééôàî`s' äãå÷ôì íéáåøî øôñî éðééôàîñôà úåéäì ìåëé åðéà `s' äãå÷ôì éøôñî ïééôàî%s úàéø÷á (%s) äì÷úsed-3.62/po/he.po0000644000076600007660000002740410176462002010533 00000000000000# Hebrew messages for GNU Sed -*- coding: hebrew-iso-8bit -*- # Copyright (C) 2001 Free Software Foundation, Inc. # Eli Zaretskii , 2001. # msgid "" msgstr "" "Project-Id-Version: sed 3.02.80\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2001-08-04 20:37+0300\n" "Last-Translator: Eli Zaretskii \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-8\n" "Content-Transfer-Encoding: 8-bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "`s' ìù øëåî-éúìá ïééôàî" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "%s úàéø÷á (%s) äì÷ú" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 msgid "invalid escape sequence in character class" msgstr "" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "âåæ-ïá åì ïéàù `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "`s' ìù øëåî-éúìá ïééôàî" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "äøñç äãå÷ô" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 msgid "regular expression too large" msgstr "" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 msgid "POSIX collating elements are not supported" msgstr "" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 msgid "invalid repeat counts in {}" msgstr "" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "`!' éåáéø" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "éåôö-éúìá `,'" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "äðåùàø úáåúëë ~N åà +N-á ùîúùäì ïúéð àì" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "âåæ-ïá åì ïéàù `{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "éåôö-éúìá `}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "äãå÷ôä éøçà íéøúåéî íéåú" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "úåáåúë ìá÷î åðéà `}'" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr "úåáåúë ìá÷î åðéà :" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "úåáåúë úåìá÷î ïðéà úåøòä" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "äøñç äãå÷ô" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "ãáìá úçà úáåúë úìá÷î åæ äãå÷ô" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "íåéñ àìì úáåúë ìù éøìåâø éåèéá" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "íåéñ àìì `s' úãå÷ô" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "íåéñ àìì `y' úãå÷ô" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "`s' ìù øëåî-éúìá ïééôàî" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "`s' äãå÷ôì íéáåøî `p' éðééôàî" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "`s' äãå÷ôì íéáåøî `g' éðééôàî" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "`s' äãå÷ôì íéáåøî øôñî éðééôàî" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "ñôà úåéäì ìåëé åðéà `s' äãå÷ôì éøôñî ïééôàî" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "äðåù êøåàá ïðéä `y' äãå÷ôì úåæåøçî" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "úáåúëä ïééöîá éåâù ùåîéù" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "úøëåî-éúìá äãå÷ô äðéä" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s úéðëúá (%s õáå÷ ìù %lu äøåù) %s äàéâù\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s úéðëúá (%lu 'ñî -e éåèéá ìù %lu 'ñî åú) %s äàéâù\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "äàöîð àì `%s' äöéô÷ úéååú" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s úéðëúá %s úàéø÷á (%s) äàéâù\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "%s õáå÷ úçéúôá äì÷ú" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "%s õáå÷ úçéúôá äì÷ú" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" " .%s úáåúëì (bugs) äì÷ú éçååéã çåìùì àð\n" " .(``Subject'') ``ïåãðä'' úøåùá ``%s'' äìéî ìåìëì åãéô÷ä àðà\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "äååìî äðéà úéðëúä .øå÷îä éöá÷ úà äàø ,èåøéô øúéì ;úéùôç äðëú äðéä åæ úéðëú\n" " äãéîá úàæå ,àéäù úéìëú åæéàì äîàúä åà úåøéçñ íùì àì åìéôà ;úåéøçà áúëá\n" " .úàæ øùôàî ÷åçäù\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s úéðëúá %s úàéø÷á (%s) äàéâù\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "%s õáå÷ úçéúôá äì÷ú" #: lib/utils.c:220 #, fuzzy, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "èìôäî íé÷ìç %d ìù %s-ì äáéúëá (%s) äì÷ú" msgstr[1] "èìôäî íé÷ìç %d ìù %s-ì äáéúëá (%s) äì÷ú" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "%s úàéø÷á (%s) äì÷ú" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s úéðëúá %s úàéø÷á (%s) äàéâù\n" #, fuzzy #~ msgid "Unmatched [ or [^" #~ msgstr "âåæ-ïá åì ïéàù `{'" #, fuzzy #~ msgid "Unmatched ( or \\(" #~ msgstr "âåæ-ïá åì ïéàù `{'" #, fuzzy #~ msgid "Unmatched \\{" #~ msgstr "âåæ-ïá åì ïéàù `{'" #, fuzzy #~ msgid "Unmatched ) or \\)" #~ msgstr "âåæ-ïá åì ïéàù `{'" sed-3.62/po/hr.gmo0000644000076600007660000000361510176462004010714 00000000000000•Þ „ì0º1%ì)Cd`Å#ä#&,,S€©•ž? Þÿ:eTº%Ö%ü"-Bp    %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. `}' doesn't want any addressesmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zeroread error on %s: %sProject-Id-Version: sed 3.02a POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2002-06-14 15:17-01 Last-Translator: Denis Lackovic Language-Team: Croatian MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=(n==1?0:1); X-Generator: TransDict server %s Ovo je slobodni softver; pogledajte kod kako biste doznali uvjete kopiranja. NEMA garancije; Äak ni tvrdnje o ISPLATIVOSTI ili POGODNOSTI ZA NEKU SVRHU. %s: -e izraz #%lu, znak %lu: %s %s: ne mogu Äitati %s: %s %s: datoteka %s redak %lu: %s : ne želi nikakve adreseE-mail bug prijave (na engleskom) poÅ¡aljite na: %s . UkljuÄite rijeÄ ``%s'' u polju ``Subject:''. `}' ne želi nikakve adreseviÅ¡estruke `g' opcije za `s' naredbuviÅ¡estruke `p' opcije za `s' naredbuviÅ¡ak opcija za za `s' naredbubroj opcija za naredbu `s' ne smije biti nulaGreÅ¡ka u Äitanju na %s: %ssed-3.62/po/hr.po0000644000076600007660000003050110176462002010540 00000000000000# Translation of sed to Croatian # Copyright (C) 2002 Free Software Foundation, Inc. # Denis Lackovi , 2002. # msgid "" msgstr "" "Project-Id-Version: sed 3.02a\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2002-06-14 15:17-01\n" "Last-Translator: Denis Lackovic \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=(n==1?0:1);\n" "X-Generator: TransDict server\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Nepoznata opcija za `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "GreÅ¡ka u Äitanju na %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 msgid "invalid escape sequence in character class" msgstr "" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Neuparena `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Nepoznata opcija za `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Nedostaje naredba" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Nedostaje prethodni regularni izraz" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 msgid "POSIX collating elements are not supported" msgstr "" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 msgid "invalid repeat counts in {}" msgstr "" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "ViÅ¡estruki `!'" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "NeoÄekivani `,'" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Ne mogu koristiti +N ili ~N kao prvu adresu" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Neuparena `{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "NeoÄekivana `}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "ViÅ¡ak znakova nakon komande" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' ne želi nikakve adrese" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": ne želi nikakve adrese" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Komentari ne primaju adrese" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Nedostaje naredba" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Naredba koristi samo jednu adresu" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "NezavrÅ¡eni regularni izraz adrese" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "NezavrÅ¡ena `s' naredba" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "NezavrÅ¡ena `y' naredba" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Nepoznata opcija za `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "viÅ¡estruke `p' opcije za `s' naredbu" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "viÅ¡estruke `g' opcije za `s' naredbu" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "viÅ¡ak opcija za za `s' naredbu" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "broj opcija za naredbu `s' ne smije biti nula" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "znakovni nizovi za naredbu y su razliÄitih duljina" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Neispravna uporaba adresnog modifikatora" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Nepoznata naredba:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: datoteka %s redak %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e izraz #%lu, znak %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Ne mogu naći labelu na koju bi trebalo skoÄiti `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: ne mogu Äitati %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Ne mogu otvoriti datoteku %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Ne mogu otvoriti datoteku %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Nedostaje prethodni regularni izraz" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "E-mail bug prijave (na engleskom) poÅ¡aljite na: %s .\n" "UkljuÄite rijeÄ ``%s'' u polju ``Subject:''.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Ovo je slobodni softver; pogledajte kod kako biste doznali uvjete " "kopiranja.\n" " NEMA garancije;\n" "Äak ni tvrdnje o ISPLATIVOSTI ili POGODNOSTI ZA NEKU SVRHU.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: ne mogu Äitati %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Ne mogu otvoriti datoteku %s" #: lib/utils.c:220 #, fuzzy, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "Ne mogu upisati %d item%s u %s: %s" msgstr[1] "Ne mogu upisati %d item%s u %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "GreÅ¡ka u Äitanju na %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: ne mogu Äitati %s: %s\n" #, fuzzy #~ msgid "Invalid regular expression" #~ msgstr "Nedostaje prethodni regularni izraz" #, fuzzy #~ msgid "Unmatched [ or [^" #~ msgstr "Neuparena `{'" #, fuzzy #~ msgid "Unmatched ( or \\(" #~ msgstr "Neuparena `{'" #, fuzzy #~ msgid "Unmatched \\{" #~ msgstr "Neuparena `{'" #, fuzzy #~ msgid "Invalid preceding regular expression" #~ msgstr "Nedostaje prethodni regularni izraz" #, fuzzy #~ msgid "Premature end of regular expression" #~ msgstr "Nedostaje prethodni regularni izraz" #, fuzzy #~ msgid "Unmatched ) or \\)" #~ msgstr "Neuparena `{'" #~ msgid "No previous regular expression" #~ msgstr "Nedostaje prethodni regularni izraz" sed-3.62/po/hu.gmo0000644000076600007660000000542110176462004010714 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^”tW èa(Js‘ª{À < O nS † Ú, ð) ) G* q- œ Ê ç ü     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.8 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2003-10-26 09:28+0100 Last-Translator: Mihály Gyulai Language-Team: Hungarian MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-2 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=1; plural=0; -R --regexp-perl Perl 5 reguláris kifejezés nyelvtanának használata. %s Ez egy ingyenes számítógépes program. A forrásban megtalálhatók a másolás feltételei. SEMMILYEN garanciát nem vállalunk, még azt sem állítjuk, hogy ez a program KERESKEDELMI CÉLOKRA ALKALMAS vagy HASZNÁLHATÓ EGY ADOTT FELADATRA. %s: -e kifejezés #%lu, karakter %lu: %s %s: nem lehet olvasni %s: %s %s: fájl %s sor %lu: %s : nem igényel címzéstA fordítási hibákat kérem a gyulai@fbi.hu címre küldeni. Angolul ide: %s . A levél Tárgy mezejében legyen ott a `%s' szó. GNU sed verzió %s az `e' parancs nincs támogatva`}' nem igényel címzéstnem tudom a(z) %d elemet ide írni %s: %snem tudom a(z) %d elemeket ide írni %s: %shiba az alfolyamatbana 'sed' program újabb verziójára van szükségtöbbszörös `g' opció, `s' parancs melletttöbbszörös `p' opció, `s' parancs melletttöbbszörös szám opció, `s' parancs melletta(z) `s' parancs szám opciója nem lehet nullaaz `e' opció nincs támogatvaolvasási hiba %s: %ssuper-sed verzió %s sed-3.62/po/hu.po0000644000076600007660000003277010176462002010555 00000000000000# Hungarian translation of GNU sed # Copyright (C) 2002 Free Software Foundation, Inc. # Gábor István , 2002. # Mihály Gyulai , 2003. msgid "" msgstr "" "Project-Id-Version: sed 4.0.8\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2003-10-26 09:28+0100\n" "Last-Translator: Mihály Gyulai \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=1; plural=0;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Ismeretlen `s' opció" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "olvasási hiba %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Érvénytelen karakterosztály-név" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Nincs párban `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Ismeretlen `s' opció" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Hiányzó parancs" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Túl nagy reguláris kifejezés" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "az `e' opció nincs támogatva" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "\\{\\}-nak érvénytelen a tartalma" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Több `!'" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Váratlan `,'" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Nem lehet használni a +N-t vagy ~N-t elso címként" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Nincs párban `{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Nincs párban `}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Extra karakterek a parancs után " #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "`a', `c' vagy `i' parancs után \\ szükséges" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' nem igényel címzést" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": nem igényel címzést" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Megjegyzésben nem lehet címzés" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Hiányzó parancs" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "A parancs csak egy címzést használ" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Befejezetlen regex cím" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Befejezetlen `s' parancs" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Befejezetlen `y' parancs" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Ismeretlen `s' opció" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "többszörös `p' opció, `s' parancs mellett" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "többszörös `g' opció, `s' parancs mellett" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "többszörös szám opció, `s' parancs mellett" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "a(z) `s' parancs szám opciója nem lehet nulla" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "a(z) `y' parancs szövegeinek hossza különbözõ" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "a 'sed' program újabb verziójára van szükség" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "A parancs csak egy címzést használ" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Ismeretlen parancs:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: fájl %s sor %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e kifejezés #%lu, karakter %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Az ugráshoz (`%s') nem találom a címkét" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: nem lehet olvasni %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Nem lehet megnyitni a(z) %s fájlt: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Nem lehet megnyitni az átmeneti fájlt: %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "hiba az alfolyamatban" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "az `e' opció nincs támogatva" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "az `e' parancs nincs támogatva" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Nincsen elõzõ reguláris kifejezés" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Nem lehet módosítót megadni üres reguláris kifejezéshez" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Hibás hivatkozás (\\%d) a(z) `s' parancs RHS-ére" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R --regexp-perl\n" " Perl 5 reguláris kifejezés nyelvtanának használata.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R --regexp-perl\n" " Perl 5 reguláris kifejezés nyelvtanának használata.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "A fordítási hibákat kérem a gyulai@fbi.hu címre küldeni. \n" "Angolul ide: %s . A levél Tárgy mezejében legyen ott a `%s' szó.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed verzió %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "A GNU 3.02.80-as sed verzión alapszik\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed verzió %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Ez egy ingyenes számítógépes program. A forrásban megtalálhatók a másolás " "feltételei.\n" "SEMMILYEN garanciát nem vállalunk, még azt sem állítjuk, hogy ez a program\n" "KERESKEDELMI CÉLOKRA ALKALMAS vagy HASZNÁLHATÓ EGY ADOTT FELADATRA.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: nem lehet olvasni %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Nem lehet megnyitni a(z) %s fájlt: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "nem tudom a(z) %d elemet ide írni %s: %s" msgstr[1] "nem tudom a(z) %d elemeket ide írni %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "olvasási hiba %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: nem lehet olvasni %s: %s\n" #~ msgid "Success" #~ msgstr "Sikeres" #~ msgid "No match" #~ msgstr "Nincs találat" #~ msgid "Invalid regular expression" #~ msgstr "Hibás reguláris kifejezés" #~ msgid "Invalid collation character" #~ msgstr "Érvénytelen összehasonlító karakter" #~ msgid "Trailing backslash" #~ msgstr "Lezáró visszaperjel" #~ msgid "Invalid back reference" #~ msgstr "Érvénytelen vissza-hivatkozás" #~ msgid "Unmatched [ or [^" #~ msgstr "Nincs párban [ vagy [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "Nincs párban ( vagy \\(" #~ msgid "Unmatched \\{" #~ msgstr "Nincs párban \\{" #~ msgid "Invalid range end" #~ msgstr "Sorozat érvénytelen vége" #~ msgid "Memory exhausted" #~ msgstr "Kevés a memória" #~ msgid "Invalid preceding regular expression" #~ msgstr "Érvénytelen megelõzõ reguláris kifejezés" #~ msgid "Premature end of regular expression" #~ msgstr "Reguláris kifejezés túl korai vége" #~ msgid "Unmatched ) or \\)" #~ msgstr "Nincs párban ) vagy \\)" #~ msgid "No previous regular expression" #~ msgstr "Nincsen elõzõ reguláris kifejezés" sed-3.62/po/id.gmo0000644000076600007660000000527710176462004010705 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^ªtZºz#5Yy”Z°   9K W £ ½" Ù" ü! / A q ‹ «     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.9 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-04-27 14:56+0700 Last-Translator: Tedi Heriyanto Language-Team: Indonesian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=1; plural=0; X-Generator: KBabel 1.3 -R, --regexp-perl gunakan sintaks reguler ekspresi Perl 5 dalam skrip. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e ekspresi #%lu, char %lu: %s %s: tidak dapat membaca %s: %s %s: file %s baris %lu: %s : tidak menginginkan alamatEmail laporan kesalahan ke: %s Pastikan untuk menyertakan kata "%s" di field "Subject:". GNU sed versi %s perintah `e' tidak didukung`}' tidak menginginkan alamattidak dapat menulis %d item ke %s: %stidak dapat menulis %d item ke %s: %skesalahan dalam subprosesmengharapkan versi baru sedopsion `g' ganda bagi perintah `s'opsion `p' ganda bagi perintah `s'opsion beragam untuk perintah `s'opsion angka untuk perintah `s' tidak boleh noloption `e' tidak didukungkesalahan pembacaan pada %s: %ssuper-sed versi %s sed-3.62/po/id.po0000644000076600007660000003302210176462002010524 00000000000000# translation of sed-4.0.9.id.po to Indonesian # sed 4.0.9 (Indonesian) # Copyright (C) 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. # Tedi Heriyanto , 2002, 2003, 2004. # msgid "" msgstr "" "Project-Id-Version: sed 4.0.9\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-04-27 14:56+0700\n" "Last-Translator: Tedi Heriyanto \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: KBabel 1.3\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Opsion tidak dikenal bagi `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "kesalahan pembacaan pada %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Nama kelas karakter tidak valid" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "`{' tidak sesuai" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Opsion tidak dikenal bagi `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Perintah hilang" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Reguler ekspresi terlalu besar" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "option `e' tidak didukung" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Isi \\{\\} tidak valid" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "`!' ganda" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "`,' tidak diharapkan" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Tidak dapat menggunakan +N atau ~N sebagai alamat pertama" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "`{' tidak sesuai" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "`}' tidak diharapkan" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Karakter tambahan setelah perintah" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Diharapkan \\ setelah `a', `c' atau `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' tidak menginginkan alamat" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": tidak menginginkan alamat" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Komentar tidak menerima alamat" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Perintah hilang" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Perintah hanya menggunakan satu alamat" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Alamat regex yang tidak selesai" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Perintah `s' tidak selesai" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Perintah `y' tidak selesai" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Opsion tidak dikenal bagi `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "opsion `p' ganda bagi perintah `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "opsion `g' ganda bagi perintah `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "opsion beragam untuk perintah `s'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "opsion angka untuk perintah `s' tidak boleh nol" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "string untuk perintah y dalam panjang yang berbeda" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "mengharapkan versi baru sed" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Penggunaan modifier alamat yang tidak valid" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Perintah tidak dikenal:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: file %s baris %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e ekspresi #%lu, char %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Tidak dapat menemukan label untuk melompat ke `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: tidak dapat membaca %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Tidak dapat membuka file %s %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Tidak dapat membuka file temporer %s %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "kesalahan dalam subproses" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "option `e' tidak didukung" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "perintah `e' tidak didukung" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Tidak ada reguler ekspresi sebelumnya" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Tidak dapat menspesifikasikan modified pada regexp kosong" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Referensi tidak valid \\%d pada perintah `s' RHS" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " gunakan sintaks reguler ekspresi Perl 5 dalam skrip.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " gunakan sintaks reguler ekspresi Perl 5 dalam skrip.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Email laporan kesalahan ke: %s \n" "Pastikan untuk menyertakan kata \"%s\" di field \"Subject:\".\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed versi %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "berdasarkan pada GNU sed versi 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versi %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: tidak dapat membaca %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Tidak dapat membuka file %s %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "tidak dapat menulis %d item ke %s: %s" msgstr[1] "tidak dapat menulis %d item ke %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "kesalahan pembacaan pada %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: tidak dapat membaca %s: %s\n" #~ msgid "Success" #~ msgstr "Sukses" #~ msgid "No match" #~ msgstr "Tidak cocok" #~ msgid "Invalid regular expression" #~ msgstr "Reguler ekspresi tidak valid" #~ msgid "Invalid collation character" #~ msgstr "Karakter kolasi tidak valid" #~ msgid "Trailing backslash" #~ msgstr "Trailing backslash" #~ msgid "Invalid back reference" #~ msgstr "Referensi balik tidak valid" #~ msgid "Unmatched [ or [^" #~ msgstr "[ atau [^ tidak sesuai" #~ msgid "Unmatched ( or \\(" #~ msgstr "( atau \\( tidak sesuai" #~ msgid "Unmatched \\{" #~ msgstr "\\{ tidak sesuai" #~ msgid "Invalid range end" #~ msgstr "Akhir batas tidak valid" #~ msgid "Memory exhausted" #~ msgstr "Memori habis" #~ msgid "Invalid preceding regular expression" #~ msgstr "Reguler ekspresi sebelumnya tidak valid" #~ msgid "Premature end of regular expression" #~ msgstr "Akhir reguler ekspresi prematur" #~ msgid "Unmatched ) or \\)" #~ msgstr ") atau \\) tidak sesuai" #~ msgid "No previous regular expression" #~ msgstr "Tidak ada reguler ekspresi sebelumnya" sed-3.62/po/insert-header.sin0000644000076600007660000000124010143704211013025 00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } sed-3.62/po/it.gmo0000644000076600007660000003021210176462004010710 00000000000000•ÞnŒ•ü Pú Q, L5 y7 ¯\ ç` Du ¥l b ˆV ëY B~ œº«f%xžµÏédk*Hª2ó&:Oiˆ)¥ ÏÜò!8Zo(„­#Ë1ï!$Af#€B¤2ç+D Xy—¶ËÚ!ø**Ep*Œ·(× (@)P z#ˆ#¬&Ð÷,(U%u8›Ôí  *(D mŽ%«Ñæ-1GVe~”§Á ×åö , Mn‡  »zÈ"C-f?”?ÔX\mrÊš=eØY >` ˜€ ù[!zÅ!Ö"œ+"³"ß"ÿ##.f#F#­7#ÂP#ú5$K$$ž$¼$×1$ñ<%#%`*%u% %¼%Ú4%ú&/&LD&j &¯"&Ð/&ó1'#9'U!','±U'Þ&(4$([(€(Ÿ(º'(×'(ÿ)')8)G/)f2)–=)É7*.*?*n5*‹*Á*Ü.*ô+#+4 +L#+Y#+})+¡*+Ë++ö6,"+,Y,,…9,²,ì- -!8-B3-{$-¯!-Ô7-ö...J5.d.š .± .¾-.Ë.ù/-/&/T/o/‚/š"/µ#/Ø!/ü008#0R0v7N.a!@B'O `;^P%Ve:I?UlMdG5FL>gT Y\"mi[ j9K Eb8J/ WH*f6h,_-DR2Xc0S#=<(&CAQ 4)+$1k]n3Z If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. --help display this help and exit --version output version information and exit --posix disable all GNU extensions. -R, --regexp-perl use Perl 5's regular expressions syntax in the script. -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) -l N, --line-length=N specify the desired line-wrap length for the `l' command -n, --quiet, --silent suppress automatic printing of pattern space -r, --regexp-extended use extended regular expressions in the script. -s, --separate consider files as separate rather than as a single continuous long stream. -u, --unbuffered load minimal amounts of data from the input files and flush the output buffers more often %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s at offset %-6d%s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s (?p must be followed by ): doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s POSIX collating elements are not supportedUsage: %s [OPTION]... {script-only-if-no-other-script} [input-file]... Usage: pcregrep [-bepchilnsvx] pattern [file] ... \ at end of pattern\c at end of pattern`e' command not supported`}' doesn't want any addressesassertion expected after (?(back reference to non-existent subpatternbad argumentbad collating elementbad condition (?(0)bad escape sequencebased on GNU sed version %s can't find label for jump to `%s'cannot remove %s: %scannot rename %s: %scannot specify modifiers on empty regexpcommand only uses one addresscomments don't accept any addressesconditional group contains more than two branchescouldn't edit %s: is a terminalcouldn't edit %s: not a regular filecouldn't open file %s: %scouldn't open temporary file %s: %scouldn't write %d item to %s: %scouldn't write %d items to %s: %sdelimiter character is not a single-byte characterempty expressionerroffset passed as NULLerror in subprocessexpected \ after `a', `c' or `i'expected newer version of sedextra characters after commandfailed to get memoryinternal errorinternal error: code overflowinternal error: unexpected repeatinvalid escape sequence in character classinvalid reference \%d on `s' command's RHSinvalid repeat counts in {}invalid usage of +N or ~N as first addressinvalid usage of line address 0lookbehind assertion is not fixed lengthmalformed number after (?(match failedmissing ) after commentmissing commandmissing terminating ] for character classmultiple `!'smultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandno previous regular expressionnothing to repeatnumber option to `s' command may not be zeronumber too big in {} quantifiernumbers out of order in {} quantifieroperand of unlimited repeat could match the empty stringoption `e' not supportedparentheses nested too deeplypattern errorpcregrep: error in regex at offset %d: %s pcregrep: error while studing regex: %s pcregrep: failed to open %s: %s pcregrep: unknown option %c range out of order in character classread error on %s: %sregular expression too largestrings for `y' command are different lengthssuper-sed version %s unexpected `,'unexpected `}'unknown POSIX class nameunknown command: `%c'unknown error codeunknown option bit(s) setunknown option to `s'unmatched `{'unmatched bracesunmatched parenthesesunrecognized character after (?unrecognized character after (?<unrecognized character follows \unterminated `s' commandunterminated `y' commandunterminated address regexunused errorProject-Id-Version: ssed 3.46 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2000-12-21 12:44+0100 Last-Translator: Paolo Bonzini Language-Team: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8-bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=n != 1; Se non è usata nessuna delle opzioni -e, --expression, -f o --file allora il primo argomento che non è una opzione sarà usato come lo script sed da interpretare. Tutti gli argomenti rimanenti sono nomi di file di input; se non sono specificati file di input sarà letto lo standard input. --help mostra questo aiuto ed esce --version stampa le informazioni sulla versione ed esce --posix disabilita tutte le estensioni GNU. -R, --regexp-perl usa la sintassi Perl 5 per le espressioni regolari -e script, --expression=script aggiunge lo script ai comandi da eseguire -f script-file, --file=file-script aggiunge il contenuto di file-script ai comandi da eseguire -i[SUFFIX], --in-place[=SUFFIX] scrive il risultato sul file originale (facendo una copia se è fornita un'estensione) -l N, --line-length=N specifica la lunghezza delle linee generate dal comando `l' -n, --quiet, --silent sopprime la stampa automatica del pattern space -r, --regexp-extended usa la sintassi di `egrep' per le espressioni regolari -s, --separate considera i file di input come separati invece che come un unico file lungo. -u, --unbuffered carica e visualizza i dati una a pezzetti piu' piccoli %s Questo è software libero; si veda il sorgente per le condizioni di copiatura. NON c'è garanzia; neppure di COMMERCIABILITA' o IDONEITA' AD UN PARTICOLARE SCOPO, nei limiti permessi dalla legge. %s alla posizione %-6d%s: espressione -e #%lu, carattere %lu: %s %s: impossibile leggere %s: %s %s: file %s riga %lu: %s (?p non seguito da ): non accetta indirizziSegnalare eventuali bug a: %s . Assicurarsi di includere la parola ``%s'' nell'oggetto del messaggio. GNU sed versione %s le specifiche di caratteri speciali non sono supportateUtilizzo: %s [OPZIONE]... {script-se-nessun-altro-specificato} [input-file]... Utilizzo: pcregrep [-bepchilnsvx] pattern [file] ... \ alla fine dell'espressione\c alla fine dell'espressionecomando `e' non supportato`}' non accetta indirizziatteso numero associato a una condizione dopo (?(riferimento all'indietro non valido (subpattern inesistente)argomento non validospecifica di caratteri speciali non validacondizione (?(0) non validasequenza di escape non validabasato su GNU sed versione %s impossibile trovare un'etichetta per il salto a `%s'impossibile eliminare %s: %simpossibile rinominare %s: %snon è possibile specificare dei modificatori per l'espressione vuotail comando usa solo un indirizzoi commenti non accettano indirizzipiu' di due divisioni in un gruppo condizionaleimpossibile modificare il file %s: è un terminaleimpossibile modificare il file %s: non è un file regolareimpossibile aprire il file %s: %simpossibile aprire il file temporaneo %s: %simpossibile scrivere %d elemento su %s: %simpossibile scrivere %d elementi su %s: %sil carattere delimitatore è multi-bytel'espressione regolare non e' validail parametro erroffset e' NULLerrore in un sottoprocessoatteso \ dopo `a', `c' o `i'attesa una versione piu' recente di sedci sono altri caratteri dopo il comandomemoria esauritaerrore internoerrore interno di compilazioneerrore interno: comando di ripetizione inattesosequenza di escape non valida tra parentesi quadreriferimento non valido \%d nel secondo membro del comando `s'numero di ripetizioni specificato tra graffe non validoImpossibile usare +N o ~N come primo indirizzouso non valido della linea 0i controlli all'indietro devono avere lunghezza fissanumero non valido dopo (?(espressione non trovatamanca una parentesi di chiusura di un commentomanca il comandomanca una quadra chiusa`!' multipliopzioni `g' multiple al comando `s'opzioni `p' multiple al comando `s'opzioni numeriche multiple al comando `s'occorre un'espressione regolare precedenteoperatore di ripetizione al posto sbagliatol'opzione numerica del comando `s' non può essere zeroun numero dentro le graffe e' troppo grandei numeri dentro le graffe non sono in ordineun atomo ripetibile indefinitamente potrebbe essere vuotoopzione `e' non supportataparentesi troppo annidateerrore nell'espressione regolarepcregrep: errore nell'espressione alla posizione %d: %s pcregrep: errore nell'analisi dell'espressione: %s pcregrep: impossibile aprire %s: %s pcregrep: opzione %c sconosciuta intervallo di caratteri non valido tra parentesi quadreerrore di lettura su %s: %sespressione troppo grandele stringhe per i comandi `y' hanno lunghezze diversesuper-sed versione %s `,' inattesa`}' inattesanome POSIX di classe di caratteri sconosciutocomando sconosciuto: `%c'errore sconosciutosono impostati dei bit di opzione sconosciutiopzione di `s' sconosciuta`{' non bilanciatamanca una graffa chiusamanca una parentesi chiusacarattere non riconosciuto dopo (?carattere non riconosciuto dopo (?<carattere non riconosciuto dopo \comando `s' non terminatocomando `y' non terminatoindirizzo della regex non terminatoerrore inutilizzatosed-3.62/po/it.po0000644000076600007660000003573210176462002010556 00000000000000msgid "" msgstr "" "Project-Id-Version: ssed 3.46\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2000-12-21 12:44+0100\n" "Last-Translator: Paolo Bonzini \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8-bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "Utilizzo: pcregrep [-bepchilnsvx] pattern [file] ...\n" #: pcre/pcregrep.c:212 #, c-format msgid "pcregrep: unknown option %c\n" msgstr "pcregrep: opzione %c sconosciuta\n" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "pcregrep: errore nell'espressione alla posizione %d: %s\n" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "pcregrep: errore nell'analisi dell'espressione: %s\n" #: pcre/pcregrep.c:268 #, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "pcregrep: impossibile aprire %s: %s\n" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "\\ alla fine dell'espressione" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "\\c alla fine dell'espressione" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "carattere non riconosciuto dopo \\" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "i numeri dentro le graffe non sono in ordine" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "un numero dentro le graffe e' troppo grande" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "manca una quadra chiusa" #: pcre/regexp.c:54 msgid "invalid escape sequence in character class" msgstr "sequenza di escape non valida tra parentesi quadre" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "intervallo di caratteri non valido tra parentesi quadre" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "operatore di ripetizione al posto sbagliato" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "un atomo ripetibile indefinitamente potrebbe essere vuoto" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "errore interno: comando di ripetizione inatteso" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "carattere non riconosciuto dopo (?" #: pcre/regexp.c:60 msgid "unused error" msgstr "errore inutilizzato" #: pcre/regexp.c:61 pcre/regexp.c:129 msgid "unmatched braces" msgstr "manca una graffa chiusa" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "riferimento all'indietro non valido (subpattern inesistente)" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "il parametro erroffset e' NULL" #: pcre/regexp.c:64 msgid "unknown option bit(s) set" msgstr "sono impostati dei bit di opzione sconosciuti" #: pcre/regexp.c:65 msgid "missing ) after comment" msgstr "manca una parentesi di chiusura di un commento" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "parentesi troppo annidate" #: pcre/regexp.c:67 pcre/regexp.c:137 msgid "regular expression too large" msgstr "espressione troppo grande" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "memoria esaurita" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "manca una parentesi chiusa" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "errore interno di compilazione" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "carattere non riconosciuto dopo (?<" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "i controlli all'indietro devono avere lunghezza fissa" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "numero non valido dopo (?(" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "piu' di due divisioni in un gruppo condizionale" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "atteso numero associato a una condizione dopo (?(" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "(?p non seguito da )" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "nome POSIX di classe di caratteri sconosciuto" #: pcre/regexp.c:78 msgid "POSIX collating elements are not supported" msgstr "le specifiche di caratteri speciali non sono supportate" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "condizione (?(0) non valida" #: pcre/regexp.c:125 msgid "internal error" msgstr "errore interno" #: pcre/regexp.c:126 msgid "invalid repeat counts in {}" msgstr "numero di ripetizioni specificato tra graffe non valido" #: pcre/regexp.c:127 msgid "pattern error" msgstr "errore nell'espressione regolare" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "specifica di caratteri speciali non valida" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "sequenza di escape non valida" #: pcre/regexp.c:134 msgid "empty expression" msgstr "l'espressione regolare non e' valida" #: pcre/regexp.c:140 msgid "bad argument" msgstr "argomento non valido" #: pcre/regexp.c:141 msgid "match failed" msgstr "espressione non trovata" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "errore sconosciuto" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "%s alla posizione %-6d" #: sed/compile.c:162 msgid "multiple `!'s" msgstr "`!' multipli" #: sed/compile.c:163 msgid "unexpected `,'" msgstr "`,' inattesa" #: sed/compile.c:164 msgid "invalid usage of +N or ~N as first address" msgstr "Impossibile usare +N o ~N come primo indirizzo" #: sed/compile.c:165 msgid "unmatched `{'" msgstr "`{' non bilanciata" #: sed/compile.c:166 msgid "unexpected `}'" msgstr "`}' inattesa" #: sed/compile.c:167 msgid "extra characters after command" msgstr "ci sono altri caratteri dopo il comando" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "atteso \\ dopo `a', `c' o `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' non accetta indirizzi" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": non accetta indirizzi" #: sed/compile.c:171 msgid "comments don't accept any addresses" msgstr "i commenti non accettano indirizzi" #: sed/compile.c:172 msgid "missing command" msgstr "manca il comando" #: sed/compile.c:173 msgid "command only uses one address" msgstr "il comando usa solo un indirizzo" #: sed/compile.c:174 msgid "unterminated address regex" msgstr "indirizzo della regex non terminato" #: sed/compile.c:175 msgid "unterminated `s' command" msgstr "comando `s' non terminato" #: sed/compile.c:176 msgid "unterminated `y' command" msgstr "comando `y' non terminato" #: sed/compile.c:177 msgid "unknown option to `s'" msgstr "opzione di `s' sconosciuta" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "opzioni `p' multiple al comando `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "opzioni `g' multiple al comando `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "opzioni numeriche multiple al comando `s'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "l'opzione numerica del comando `s' non può essere zero" #: sed/compile.c:182 msgid "strings for `y' command are different lengths" msgstr "le stringhe per i comandi `y' hanno lunghezze diverse" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "il carattere delimitatore è multi-byte" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "attesa una versione piu' recente di sed" #: sed/compile.c:185 msgid "invalid usage of line address 0" msgstr "uso non valido della linea 0" #: sed/compile.c:186 #, c-format msgid "unknown command: `%c'" msgstr "comando sconosciuto: `%c'" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: file %s riga %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: espressione -e #%lu, carattere %lu: %s\n" #: sed/compile.c:1644 #, c-format msgid "can't find label for jump to `%s'" msgstr "impossibile trovare un'etichetta per il salto a `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: impossibile leggere %s: %s\n" #: sed/execute.c:672 #, c-format msgid "couldn't edit %s: is a terminal" msgstr "impossibile modificare il file %s: è un terminale" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "impossibile modificare il file %s: non è un file regolare" #: lib/utils.c:196 sed/execute.c:683 #, c-format msgid "couldn't open temporary file %s: %s" msgstr "impossibile aprire il file temporaneo %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "errore in un sottoprocesso" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "opzione `e' non supportata" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "comando `e' non supportato" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "occorre un'espressione regolare precedente" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "non è possibile specificare dei modificatori per l'espressione vuota" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "riferimento non valido \\%d nel secondo membro del comando `s'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " usa la sintassi Perl 5 per le espressioni regolari\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" "Utilizzo: %s [OPZIONE]... {script-se-nessun-altro-specificato} [input-" "file]...\n" "\n" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" " -n, --quiet, --silent\n" " sopprime la stampa automatica del pattern space\n" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" " -e script, --expression=script\n" " aggiunge lo script ai comandi da eseguire\n" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" " -f script-file, --file=file-script\n" " aggiunge il contenuto di file-script ai comandi da " "eseguire\n" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " scrive il risultato sul file originale (facendo una copia\n" " se è fornita un'estensione)\n" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" " -l N, --line-length=N\n" " specifica la lunghezza delle linee generate dal comando " "`l'\n" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" " --posix\n" " disabilita tutte le estensioni GNU.\n" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -r, --regexp-extended\n" " usa la sintassi di `egrep' per le espressioni regolari\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" " -s, --separate\n" " considera i file di input come separati invece che come un\n" " unico file lungo.\n" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" " -u, --unbuffered\n" " carica e visualizza i dati una a pezzetti piu' piccoli\n" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr " --help mostra questo aiuto ed esce\n" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr " --version stampa le informazioni sulla versione ed esce\n" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" "\n" "Se non è usata nessuna delle opzioni -e, --expression, -f o --file allora " "il\n" "primo argomento che non è una opzione sarà usato come lo script sed da\n" "interpretare. Tutti gli argomenti rimanenti sono nomi di file di input; se " "non\n" "sono specificati file di input sarà letto lo standard input.\n" "\n" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Segnalare eventuali bug a: %s .\n" "Assicurarsi di includere la parola ``%s'' nell'oggetto del messaggio.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed versione %s\n" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "basato su GNU sed versione %s\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versione %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Questo è software libero; si veda il sorgente per le condizioni di " "copiatura.\n" "NON c'è garanzia; neppure di COMMERCIABILITA' o IDONEITA' AD UN PARTICOLARE\n" "SCOPO, nei limiti permessi dalla legge.\n" #: lib/utils.c:98 lib/utils.c:336 #, c-format msgid "cannot remove %s: %s" msgstr "impossibile eliminare %s: %s" #: lib/utils.c:143 #, c-format msgid "couldn't open file %s: %s" msgstr "impossibile aprire il file %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "impossibile scrivere %d elemento su %s: %s" msgstr[1] "impossibile scrivere %d elementi su %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "errore di lettura su %s: %s" #: lib/utils.c:341 #, c-format msgid "cannot rename %s: %s" msgstr "impossibile rinominare %s: %s" sed-3.62/po/ja.gmo0000644000076600007660000001743510202143315010671 00000000000000•Þ> SüHúI,D5q7§\ß`<ulb€Yã~ = ¼º L%  - D ^d { àH ô = W v! ” ¶ Ë( à # ' K$ k # ªB Î2D Xy—*¶*á , <#J#n&’¹,Ø-3aw†•« ÁÏèzÖ—(n.—/ÆNöaE§o'K—JãK.z£ü! ÂÞùfvI…'Ï÷*$Of&ƒ#ª"Î$ñ4 K&lY“(í$)N$b$‡(¬Õï$$9#^‚1Ÿ)Ñû):J\n‰§½Ýý8 ;4/- &=27*,  5+6%') $:91 !<3(#"0>. If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. --help display this help and exit --version output version information and exit --posix disable all GNU extensions. -R, --regexp-perl use Perl 5's regular expressions syntax in the script. -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) -l N, --line-length=N specify the desired line-wrap length for the `l' command -r, --regexp-extended use extended regular expressions in the script. -s, --separate consider files as separate rather than as a single continuous long stream. -u, --unbuffered load minimal amounts of data from the input files and flush the output buffers more often %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]... `e' command not supported`}' doesn't want any addressesbased on GNU sed version %s can't find label for jump to `%s'cannot remove %s: %scannot rename %s: %scannot specify modifiers on empty regexpcommand only uses one addresscomments don't accept any addressescouldn't edit %s: is a terminalcouldn't edit %s: not a regular filecouldn't open file %s: %scouldn't open temporary file %s: %scouldn't write %d item to %s: %scouldn't write %d items to %s: %sdelimiter character is not a single-byte charactererror in subprocessexpected \ after `a', `c' or `i'expected newer version of sedextra characters after commandinvalid reference \%d on `s' command's RHSinvalid usage of +N or ~N as first addressinvalid usage of line address 0missing commandmultiple `!'smultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandno previous regular expressionnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %sstrings for `y' command are different lengthssuper-sed version %s unexpected `,'unexpected `}'unknown command: `%c'unknown option to `s'unmatched `{'unterminated `s' commandunterminated `y' commandunterminated address regexProject-Id-Version: GNU sed 4.1.1 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2005-02-01 21:02+0900 Last-Translator: IIDA Yosiaki Language-Team: Japanese MIME-Version: 1.0 Content-Type: text/plain; charset=EUC-JP Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Plural-Forms: nplurals=1; plural=0; -e¡¢--expression¡¢-f¡¢--file¥ª¥×¥·¥ç¥ó¤Î¤É¤ì¤â¤Ê¤¤¤È¡¢¥ª¥×¥·¥ç¥ó°Ê³°¤Î ºÇ½é¤Î°ú¿ô¤òsed¥¹¥¯¥ê¥×¥È¤È¤·¤Æ²ò¼á¤·¤Þ¤¹¡£»Ä¤ê¤Î°ú¿ô¤ÏÁ´Éô¡¢ÆþÎÏ¥Õ¥¡ ¥¤¥ë̾¤È¤Ê¤ê¤Þ¤¹¡£ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î»ØÄ꤬¤Ê¤¤¤È¡¢É¸½àÆþÎϤòÆÉ¤ß¹þ¤ß¤Þ¤¹¡£ --help ¤³¤ÎÀâÌÀ¤òɽ¼¨¤·¤Æ½ªÎ» --version ¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ½ªÎ» --posix GNU³ÈÄ¥¤òÁ´Éô¶Ø»ß¡£ -R, --regexp-perl ¥¹¥¯¥ê¥×¥È¤ÇPerl 5¤ÎÀµµ¬É½¸½¹½Ê¸¤ò»È¤¦¡£ -e ¥¹¥¯¥ê¥×¥È, --expression=¥¹¥¯¥ê¥×¥È ¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤È¤·¤Æ¥¹¥¯¥ê¥×¥È¤òÄɲà -f ¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë, --file=¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë ¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤È¤·¤Æ¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ¤òÄɲà -i[ÀÜÈø¼­], --in-place[=ÀÜÈø¼­] ¥Õ¥¡¥¤¥ë¤ò¤½¤Î¾ì¤ÇÊÔ½¸ (³ÈÄ¥»Ò¤¬¤¢¤ì¤Ð¡¢¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºîÀ®) -l N, --line-length=N ¡Öl¡×¥³¥Þ¥ó¥ÉÍѤιÔÀÞÊÖ¤·Ä¹¤ò»ØÄê -r, --regexp-extended ¥¹¥¯¥ê¥×¥È¤Ç³ÈÄ¥Àµµ¬É½¸½¤ò»ÈÍÑ¡£ -s, --separate ¥Õ¥¡¥¤¥ë¤ò°ìÏ¢¤ÎÆþÎϤˤ»¤º¡¢ÊÌ¡¹¤Ë½èÍý¡£ -u, --unbuffered ÆþÎÏ¥Õ¥¡¥¤¥ë¤«¤é¶Ë¾®¤Î¥Ç¡¼¥¿¤ò¼è¤ê¹þ¤ß¡¢ ¤Á¤ç¤¯¤Á¤ç¤¯½ÐÎϥХåե¡¡¼¤ËÁݽФ· %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. ÌõÃí: Èó¾ï¤Ë½ÅÍפÊʸ¾Ï¤Î¤¿¤á¡¢¸¶Ê¸¤ò»Ä¤·¤Æ¤¤¤Þ¤¹¡£ -- »²¹ÍÌõ ¤³¤ì¤Ï¥Õ¥ê¡¼¡¦¥½¥Õ¥È¥¦¥§¥¢¤Ç¤¹¡£Ê£À½¤Î¾ò·ï¤Ë´Ø¤·¤Æ¤Ï¡¢¥½¡¼¥¹¤ò¤´Í÷¤¯¤À¤µ ¤¤¡£ÊݾڤϰìÀÚ¤¢¤ê¤Þ¤»¤ó¡£±ÄÍøÌÜŪ¤äË¡¤ÇÄê¤á¤é¤ì¤¿ÈÏ°Ï¤Ç¤ÎÆÃÄêÌÜŪ¤Î¤¿¤á ¤ÎŬ¹çÀ­¤â¤¢¤ê¤Þ¤»¤ó¡£ %s: -e ɽ¸½ #%lu, ʸ»ú¿ô %lu: %s %s: %s¤òÆÉ¤ß¹þ¤á¤Þ¤»¤ó: %s %s: ¥Õ¥¡¥¤¥ë %s %lu¹Ô: %s :¤Ë¥¢¥É¥ì¥¹¤ÏÉÔÍפǤ¹ÅŻҥ᡼¥ë¤Ë¤è¤ë¥Ð¥°Êó¹ð¤Î°¸Àè: %s Êó¹ð¤ÎºÝ¡¢¡ÈSubject:¡É¥Õ¥£¡¼¥ë¥É¤Î¤É¤³¤«¤Ë¡È%s¡É¤òÆþ¤ì¤Æ¤¯¤À¤µ¤¤¡£ GNU sed %sÈÇ »ÈÍÑË¡: %s [¥ª¥×¥·¥ç¥ó]... {¥¹¥¯¥ê¥×¥È(¾¤Ë¤Ê¤±¤ì¤Ð)} [ÆþÎÏ¥Õ¥¡¥¤¥ë]... ¡Öe¡×¥³¥Þ¥ó¥É¤Ï¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡Ö}¡×¤Ë¥¢¥É¥ì¥¹¤ÏÉÔÍפǤ¹¸¶ºîGNU sed %sÈÇ ¡Ö%s¡×¤Ø¤Î¥¸¥ã¥ó¥×¤Î¥é¥Ù¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó%s¤òºï½ü¤Ç¤­¤Þ¤»¤ó: %s%s¤Î̾Á°¤òÊѹ¹¤Ç¤­¤Þ¤»¤ó: %s½¤¾þ»Ò¤Ï¡¢¶õ¤ÎÀµµ¬É½¸½¤Ë»ØÄê¤Ç¤­¤Þ¤»¤ó¥³¥Þ¥ó¥É¤Ï¥¢¥É¥ì¥¹¤ò1¤Ä¤À¤±»È¤¤¤Þ¤¹¥³¥á¥ó¥È¤Ï¥¢¥É¥ì¥¹¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó%s¤Ï¡¢ÊÔ½¸¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿: üËö¤Ç¤¹%s¤Ï¡¢ÊÔ½¸¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿: Ä̾ï¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¤Þ¤»¤ó¥Õ¥¡¥¤¥ë%s¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿: %s°ì»þ¥Õ¥¡¥¤¥ë¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿: %s: %s%d¸Ä¤Î¥¢¥¤¥Æ¥à¤ò%s¤Ø½ñ¤­¹þ¤á¤Þ¤»¤ó¤Ç¤·¤¿: %s%d¸Ä¤Î¥¢¥¤¥Æ¥à¤ò%s¤Ø½ñ¤­¹þ¤á¤Þ¤»¤ó¤Ç¤·¤¿: %s¶èÀÚ¤êʸ»ú¤¬¡¢Ã±°ì¥Ð¥¤¥Èʸ»ú¤Ç¤¢¤ê¤Þ¤»¤ó»Ò¥×¥í¥»¥¹¤Î¥¨¥é¡¼\¤¬¡Öa¡×¡Öc¡×¡Öi¡×¤Î¸å¤Ëͽ´ü¤µ¤ì¤Þ¤¹sed¤Î¿·ÈǤ¬Á°Äó¤Ç¤¹¥³¥Þ¥ó¥É¤Î¸å¤í¤Ë;·×¤Êʸ»ú¤¬¤¢¤ê¤Þ¤¹¡Ös¡×¥³¥Þ¥ó¥É¤Î±¦Â¦¤Ë̵¸ú¤Ê\%d¤Î»²¾ÈºÇ½é¤Î¥¢¥É¥ì¥¹¤Ø¤Î+N¤ä~N¤Î»ØÄê¤Ï̵¸ú¤Ç¤¹Ìµ¸ú¤Ê¹Ô¥¢¥É¥ì¥¹0¤Î»ÈÍÑË¡¥³¥Þ¥ó¥É¤¬Â­¤ê¤Þ¤»¤óÊ£¿ô¤Î¡Ö!¡×¤Ç¤¹¡Ös¡×¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¡Ög¡×¥ª¥×¥·¥ç¥ó¡Ös¡×¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¡Öp¡×¥ª¥×¥·¥ç¥ó¡Ös¡×¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¿ôÃÍ¥ª¥×¥·¥ç¥óľÁ°¤ÎÀµµ¬É½¸½¤¬¡¢¤¢¤ê¤Þ¤»¤ó¡Ös¡×¥³¥Þ¥ó¥É¤Ø¤Î¿ôÃÍ¥ª¥×¥·¥ç¥ó¤ÏÎí¤Ç¤Ï¤¤¤±¤Þ¤»¤ó¡Öe¡×¥ª¥×¥·¥ç¥ó¤Ï¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó%s¤ÎÆÉ¹þ¤ß¥¨¥é¡¼: %s¡Öy¡×¥³¥Þ¥ó¥É¤Ø¤Îʸ»úÎó¤ÎŤµ¤¬¡¢°ã¤¤¤Þ¤¹super-sed %sÈÇ Í½´ü¤»¤Ì¡Ö,¡×¤Ç¤¹Í½´ü¤»¤Ì¡Ö}¡×¤Ç¤¹Ì¤ÃΤΥ³¥Þ¥ó¥É¤Ç¤¹: ¡Ö%c¡×¡Ös¡×¤Ø¤Î¥ª¥×¥·¥ç¥ó¤¬Ì¤ÃΤǤ¹Äà¤ê¹ç¤ï¤Ê¤¤¡Ö{¡×¤Ç¤¹¡Ös¡×¥³¥Þ¥ó¥É¤¬½ªÎ»¤·¤Æ¤¤¤Þ¤»¤ó¡Öy¡×¥³¥Þ¥ó¥É¤¬½ªÎ»¤·¤Æ¤¤¤Þ¤»¤ó¥¢¥É¥ì¥¹regex¤¬½ªÎ»¤·¤Æ¤¤¤Þ¤»¤ósed-3.62/po/ja.po0000644000076600007660000003540310202143314010517 00000000000000# Japanese messages for GNU sed # Copyright (C) 1999, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. # IIDA Yosiaki , 1999, 2002, 2003, 2004, 2005. # This file is distributed under the same license as the GNU sed package. # Contributed by # Yasuyuki Furukawa , 1999. # and taken over on 1999-09-24 by Japanese Team. # msgid "" msgstr "" "Project-Id-Version: GNU sed 4.1.1\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2005-02-01 21:02+0900\n" "Last-Translator: IIDA Yosiaki \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=EUC-JP\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=1; plural=0;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "¡Ös¡×¤Ø¤Î¥ª¥×¥·¥ç¥ó¤¬Ì¤ÃΤǤ¹" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "%s¤ÎÆÉ¹þ¤ß¥¨¥é¡¼: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "̵¸ú¤Êʸ»ú¥¯¥é¥¹Ì¾" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Äà¤ê¹ç¤ï¤Ê¤¤¡Ö{¡×¤Ç¤¹" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "¡Ös¡×¤Ø¤Î¥ª¥×¥·¥ç¥ó¤¬Ì¤ÃΤǤ¹" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "¥³¥Þ¥ó¥É¤¬Â­¤ê¤Þ¤»¤ó" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Â礭²á¤®¤ëÀµµ¬É½¸½" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "¡Öe¡×¥ª¥×¥·¥ç¥ó¤Ï¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 msgid "invalid repeat counts in {}" msgstr "" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 msgid "multiple `!'s" msgstr "Ê£¿ô¤Î¡Ö!¡×¤Ç¤¹" #: sed/compile.c:163 msgid "unexpected `,'" msgstr "ͽ´ü¤»¤Ì¡Ö,¡×¤Ç¤¹" #: sed/compile.c:164 msgid "invalid usage of +N or ~N as first address" msgstr "ºÇ½é¤Î¥¢¥É¥ì¥¹¤Ø¤Î+N¤ä~N¤Î»ØÄê¤Ï̵¸ú¤Ç¤¹" #: sed/compile.c:165 msgid "unmatched `{'" msgstr "Äà¤ê¹ç¤ï¤Ê¤¤¡Ö{¡×¤Ç¤¹" #: sed/compile.c:166 msgid "unexpected `}'" msgstr "ͽ´ü¤»¤Ì¡Ö}¡×¤Ç¤¹" #: sed/compile.c:167 msgid "extra characters after command" msgstr "¥³¥Þ¥ó¥É¤Î¸å¤í¤Ë;·×¤Êʸ»ú¤¬¤¢¤ê¤Þ¤¹" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "\\¤¬¡Öa¡×¡Öc¡×¡Öi¡×¤Î¸å¤Ëͽ´ü¤µ¤ì¤Þ¤¹" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "¡Ö}¡×¤Ë¥¢¥É¥ì¥¹¤ÏÉÔÍפǤ¹" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ":¤Ë¥¢¥É¥ì¥¹¤ÏÉÔÍפǤ¹" #: sed/compile.c:171 msgid "comments don't accept any addresses" msgstr "¥³¥á¥ó¥È¤Ï¥¢¥É¥ì¥¹¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó" #: sed/compile.c:172 msgid "missing command" msgstr "¥³¥Þ¥ó¥É¤¬Â­¤ê¤Þ¤»¤ó" #: sed/compile.c:173 msgid "command only uses one address" msgstr "¥³¥Þ¥ó¥É¤Ï¥¢¥É¥ì¥¹¤ò1¤Ä¤À¤±»È¤¤¤Þ¤¹" #: sed/compile.c:174 msgid "unterminated address regex" msgstr "¥¢¥É¥ì¥¹regex¤¬½ªÎ»¤·¤Æ¤¤¤Þ¤»¤ó" #: sed/compile.c:175 msgid "unterminated `s' command" msgstr "¡Ös¡×¥³¥Þ¥ó¥É¤¬½ªÎ»¤·¤Æ¤¤¤Þ¤»¤ó" #: sed/compile.c:176 msgid "unterminated `y' command" msgstr "¡Öy¡×¥³¥Þ¥ó¥É¤¬½ªÎ»¤·¤Æ¤¤¤Þ¤»¤ó" #: sed/compile.c:177 msgid "unknown option to `s'" msgstr "¡Ös¡×¤Ø¤Î¥ª¥×¥·¥ç¥ó¤¬Ì¤ÃΤǤ¹" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "¡Ös¡×¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¡Öp¡×¥ª¥×¥·¥ç¥ó" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "¡Ös¡×¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¡Ög¡×¥ª¥×¥·¥ç¥ó" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "¡Ös¡×¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¿ôÃÍ¥ª¥×¥·¥ç¥ó" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "¡Ös¡×¥³¥Þ¥ó¥É¤Ø¤Î¿ôÃÍ¥ª¥×¥·¥ç¥ó¤ÏÎí¤Ç¤Ï¤¤¤±¤Þ¤»¤ó" #: sed/compile.c:182 msgid "strings for `y' command are different lengths" msgstr "¡Öy¡×¥³¥Þ¥ó¥É¤Ø¤Îʸ»úÎó¤ÎŤµ¤¬¡¢°ã¤¤¤Þ¤¹" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "¶èÀÚ¤êʸ»ú¤¬¡¢Ã±°ì¥Ð¥¤¥Èʸ»ú¤Ç¤¢¤ê¤Þ¤»¤ó" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "sed¤Î¿·ÈǤ¬Á°Äó¤Ç¤¹" #: sed/compile.c:185 msgid "invalid usage of line address 0" msgstr "̵¸ú¤Ê¹Ô¥¢¥É¥ì¥¹0¤Î»ÈÍÑË¡" #: sed/compile.c:186 #, c-format msgid "unknown command: `%c'" msgstr "̤ÃΤΥ³¥Þ¥ó¥É¤Ç¤¹: ¡Ö%c¡×" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: ¥Õ¥¡¥¤¥ë %s %lu¹Ô: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e ɽ¸½ #%lu, ʸ»ú¿ô %lu: %s\n" #: sed/compile.c:1644 #, c-format msgid "can't find label for jump to `%s'" msgstr "¡Ö%s¡×¤Ø¤Î¥¸¥ã¥ó¥×¤Î¥é¥Ù¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: %s¤òÆÉ¤ß¹þ¤á¤Þ¤»¤ó: %s\n" #: sed/execute.c:672 #, c-format msgid "couldn't edit %s: is a terminal" msgstr "%s¤Ï¡¢ÊÔ½¸¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿: üËö¤Ç¤¹" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "%s¤Ï¡¢ÊÔ½¸¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿: Ä̾ï¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¤Þ¤»¤ó" #: lib/utils.c:196 sed/execute.c:683 #, c-format msgid "couldn't open temporary file %s: %s" msgstr "°ì»þ¥Õ¥¡¥¤¥ë¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿: %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "»Ò¥×¥í¥»¥¹¤Î¥¨¥é¡¼" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "¡Öe¡×¥ª¥×¥·¥ç¥ó¤Ï¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "¡Öe¡×¥³¥Þ¥ó¥É¤Ï¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "ľÁ°¤ÎÀµµ¬É½¸½¤¬¡¢¤¢¤ê¤Þ¤»¤ó" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "½¤¾þ»Ò¤Ï¡¢¶õ¤ÎÀµµ¬É½¸½¤Ë»ØÄê¤Ç¤­¤Þ¤»¤ó" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "¡Ös¡×¥³¥Þ¥ó¥É¤Î±¦Â¦¤Ë̵¸ú¤Ê\\%d¤Î»²¾È" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " ¥¹¥¯¥ê¥×¥È¤ÇPerl 5¤ÎÀµµ¬É½¸½¹½Ê¸¤ò»È¤¦¡£\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" "»ÈÍÑË¡: %s [¥ª¥×¥·¥ç¥ó]... {¥¹¥¯¥ê¥×¥È(¾¤Ë¤Ê¤±¤ì¤Ð)} [ÆþÎÏ¥Õ¥¡¥¤¥ë]...\n" "\n" #: sed/sed.c:102 #, fuzzy, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" "-n, --quiet, --silent\n" " ¥Ñ¥¿¡¼¥ó¡¦¥¹¥Ú¡¼¥¹¤Î¼«Æ°½ÐÎϤòÍÞÀ©\n" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" " -e ¥¹¥¯¥ê¥×¥È, --expression=¥¹¥¯¥ê¥×¥È\n" " ¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤È¤·¤Æ¥¹¥¯¥ê¥×¥È¤òÄɲÃ\n" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" " -f ¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë, --file=¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë\n" " ¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤È¤·¤Æ¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ¤òÄɲÃ\n" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" " -i[ÀÜÈø¼­], --in-place[=ÀÜÈø¼­]\n" " ¥Õ¥¡¥¤¥ë¤ò¤½¤Î¾ì¤ÇÊÔ½¸ (³ÈÄ¥»Ò¤¬¤¢¤ì¤Ð¡¢¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºî" "À®)\n" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" " -l N, --line-length=N\n" " ¡Öl¡×¥³¥Þ¥ó¥ÉÍѤιÔÀÞÊÖ¤·Ä¹¤ò»ØÄê\n" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" " --posix\n" " GNU³ÈÄ¥¤òÁ´Éô¶Ø»ß¡£\n" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -r, --regexp-extended\n" " ¥¹¥¯¥ê¥×¥È¤Ç³ÈÄ¥Àµµ¬É½¸½¤ò»ÈÍÑ¡£\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" " -s, --separate\n" " ¥Õ¥¡¥¤¥ë¤ò°ìÏ¢¤ÎÆþÎϤˤ»¤º¡¢ÊÌ¡¹¤Ë½èÍý¡£\n" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" " -u, --unbuffered\n" " ÆþÎÏ¥Õ¥¡¥¤¥ë¤«¤é¶Ë¾®¤Î¥Ç¡¼¥¿¤ò¼è¤ê¹þ¤ß¡¢\n" " ¤Á¤ç¤¯¤Á¤ç¤¯½ÐÎϥХåե¡¡¼¤ËÁݽФ·\n" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr " --help ¤³¤ÎÀâÌÀ¤òɽ¼¨¤·¤Æ½ªÎ»\n" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr " --version ¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ½ªÎ»\n" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" "\n" "-e¡¢--expression¡¢-f¡¢--file¥ª¥×¥·¥ç¥ó¤Î¤É¤ì¤â¤Ê¤¤¤È¡¢¥ª¥×¥·¥ç¥ó°Ê³°¤Î\n" "ºÇ½é¤Î°ú¿ô¤òsed¥¹¥¯¥ê¥×¥È¤È¤·¤Æ²ò¼á¤·¤Þ¤¹¡£»Ä¤ê¤Î°ú¿ô¤ÏÁ´Éô¡¢ÆþÎÏ¥Õ¥¡\n" "¥¤¥ë̾¤È¤Ê¤ê¤Þ¤¹¡£ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î»ØÄ꤬¤Ê¤¤¤È¡¢É¸½àÆþÎϤòÆÉ¤ß¹þ¤ß¤Þ¤¹¡£\n" "\n" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "ÅŻҥ᡼¥ë¤Ë¤è¤ë¥Ð¥°Êó¹ð¤Î°¸Àè: %s\n" "Êó¹ð¤ÎºÝ¡¢¡ÈSubject:¡É¥Õ¥£¡¼¥ë¥É¤Î¤É¤³¤«¤Ë¡È%s¡É¤òÆþ¤ì¤Æ¤¯¤À¤µ¤¤¡£\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed %sÈÇ\n" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "¸¶ºîGNU sed %sÈÇ\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "" "GNU sed %sÈÇ\n" "\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" "\n" "ÌõÃí: Èó¾ï¤Ë½ÅÍפÊʸ¾Ï¤Î¤¿¤á¡¢¸¶Ê¸¤ò»Ä¤·¤Æ¤¤¤Þ¤¹¡£\n" " -- »²¹ÍÌõ\n" "¤³¤ì¤Ï¥Õ¥ê¡¼¡¦¥½¥Õ¥È¥¦¥§¥¢¤Ç¤¹¡£Ê£À½¤Î¾ò·ï¤Ë´Ø¤·¤Æ¤Ï¡¢¥½¡¼¥¹¤ò¤´Í÷¤¯¤À¤µ\n" "¤¤¡£ÊݾڤϰìÀÚ¤¢¤ê¤Þ¤»¤ó¡£±ÄÍøÌÜŪ¤äË¡¤ÇÄê¤á¤é¤ì¤¿ÈÏ°Ï¤Ç¤ÎÆÃÄêÌÜŪ¤Î¤¿¤á\n" "¤ÎŬ¹çÀ­¤â¤¢¤ê¤Þ¤»¤ó¡£\n" #: lib/utils.c:98 lib/utils.c:336 #, c-format msgid "cannot remove %s: %s" msgstr "%s¤òºï½ü¤Ç¤­¤Þ¤»¤ó: %s" #: lib/utils.c:143 #, c-format msgid "couldn't open file %s: %s" msgstr "¥Õ¥¡¥¤¥ë%s¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "%d¸Ä¤Î¥¢¥¤¥Æ¥à¤ò%s¤Ø½ñ¤­¹þ¤á¤Þ¤»¤ó¤Ç¤·¤¿: %s" msgstr[1] "%d¸Ä¤Î¥¢¥¤¥Æ¥à¤ò%s¤Ø½ñ¤­¹þ¤á¤Þ¤»¤ó¤Ç¤·¤¿: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "%s¤ÎÆÉ¹þ¤ß¥¨¥é¡¼: %s" #: lib/utils.c:341 #, c-format msgid "cannot rename %s: %s" msgstr "%s¤Î̾Á°¤òÊѹ¹¤Ç¤­¤Þ¤»¤ó: %s" #~ msgid "Success" #~ msgstr "À®¸ù" #~ msgid "No match" #~ msgstr "¾È¹ç¤·¤Þ¤»¤ó" #~ msgid "Invalid regular expression" #~ msgstr "̵¸ú¤ÊÀµµ¬É½¸½" #~ msgid "Invalid collation character" #~ msgstr "̵¸ú¤Ê¹»¹çʸ»ú" #~ msgid "Trailing backslash" #~ msgstr "¸å³¤ÎµÕ¥¹¥é¥Ã¥·¥å" #~ msgid "Invalid back reference" #~ msgstr "̵¸ú¤ÊµÕ»²¾È" #~ msgid "Unmatched [ or [^" #~ msgstr "[¤ä[^¤¬Äà¹ç¤¤¤Þ¤»¤ó" #~ msgid "Unmatched ( or \\(" #~ msgstr "(¤ä\\(¤¬Äà¹ç¤¤¤Þ¤»¤ó" #~ msgid "Unmatched \\{" #~ msgstr "\\{¤¬Äà¹ç¤¤¤Þ¤»¤ó" #~ msgid "Invalid content of \\{\\}" #~ msgstr "̵¸ú¤Ê\\{\\}¤ÎÆâÍÆ\"" #~ msgid "Invalid range end" #~ msgstr "̵¸ú¤ÊÈϰϤνªÃ¼" #~ msgid "Memory exhausted" #~ msgstr "¥á¥â¥ê¡¼¤¬Â­¤ê¤Þ¤»¤ó" #~ msgid "Invalid preceding regular expression" #~ msgstr "̵¸ú¤ÊÀè¹ÔÀµµ¬É½¸½" #~ msgid "Premature end of regular expression" #~ msgstr "Áá²á¤®¤ëÀµµ¬É½¸½½ªÃ¼" #~ msgid "Unmatched ) or \\)" #~ msgstr "Äà¤ê¹ç¤ï¤Ê¤¤)¤ä\\)" #~ msgid "No previous regular expression" #~ msgstr "ľÁ°¤ÎÀµµ¬É½¸½¤¬¡¢¤¢¤ê¤Þ¤»¤ó" sed-3.62/po/ko.gmo0000644000076600007660000000363310176462004010714 00000000000000•Þ „ì0º1%ì)Cd`Å#ä#&,,S€U•Ýë%Éï".aQ$³'Ø'((0Q‚    %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. `}' doesn't want any addressesmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zeroread error on %s: %sProject-Id-Version: GNU sed 3.02.80 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2001-10-12 17:26+0900 Last-Translator: Jong-Hoon Ryu Language-Team: Korean MIME-Version: 1.0 Content-Type: text/plain; charset=EUC-KR Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: %s ÀÌ ÇÁ·Î±×·¥Àº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î ÀÔ´Ï´Ù; ÀÚ¼¼ÇÑ ³»¿ëÀº ÀúÀÛ±Ç ³»¿ëÀÇ ¿ø¹®À» Âü°íÇϽñ⠹ٶø´Ï´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¹ý¿¡ ÀúÃ˵ÇÁö ¾Ê´Â ¹üÀ§¿¡¼­ »ó¾÷ÀûÀ̳ª Ư¼ö ¸ñÀûÀ¸·Î »ç¿ëµÉ °æ¿ì¸¦ Æ÷ÇÔÇÑ ¾î¶°ÇÑ °æ¿ì¿¡µµ º¸ÁõÇÏÁö ¾Ê½À´Ï´Ù. %s: -e expression #%lu, char %lu: %s %s: %s (À»)¸¦ ÀÐÀ» ¼ö ¾øÀ½: %s %s: %s ÆÄÀÏÀÇ %lu ¹øÂ° ÁÙ: %s : ¿¡ ¾î¶°ÇÑ ÁÖ¼Òµµ ÇÊ¿äÄ¡ ¾Ê½À´Ï´Ù¹ö±×¸¦ º¸°íÇÒ E-mail ÁÖ¼Ò: %s . ``Subject:'' Ç׸ñ¿¡ ¹Ýµå½Ã ``%s'' ´Ü¾î¸¦ Æ÷ÇÔÇØ Áֽñ⠹ٶø´Ï´Ù. `}' ¿¡ ¾î¶°ÇÑ ÁÖ¼Òµµ ÇÊ¿äÄ¡ ¾Ê½À´Ï´Ù`s' ¸í·É¿¡ `g' ¿É¼ÇÀÌ Áߺ¹µÇ¾î ÀÖ½À´Ï´Ù`s' ¸í·É¿¡ `p' ¿É¼ÇÀÌ Áߺ¹µÇ¾î ÀÖ½À´Ï´Ù`s' ¸í·É¿¡ ¼ýÀÚ ¿É¼ÇÀÌ Áߺ¹µÇ¾î ÀÖ½À´Ï´Ù`s' ¸í·ÉÀÇ ¼ýÀÚ ¿É¼Ç¿¡ '0' À» ÁöÁ¤ÇÒ ¼ö ¾ø½À´Ï´Ù%s ÀÇ ³»¿ë Àб⠿À·ù: %ssed-3.62/po/ko.po0000644000076600007660000003006110176462002010541 00000000000000# ko.po -- Korean messages for GNU sed # Copyright (C) 2001 Free Software Foundation, Inc. # Jong-Hoon Ryu , 2001. # msgid "" msgstr "" "Project-Id-Version: GNU sed 3.02.80\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2001-10-12 17:26+0900\n" "Last-Translator: Jong-Hoon Ryu \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=EUC-KR\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "`s' ¿¡ ¾Ë ¼ö ¾ø´Â ¿É¼ÇÀÌ ÀÖ½À´Ï´Ù" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "%s ÀÇ ³»¿ë Àб⠿À·ù: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 msgid "invalid escape sequence in character class" msgstr "" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "`{' °¡ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "`s' ¿¡ ¾Ë ¼ö ¾ø´Â ¿É¼ÇÀÌ ÀÖ½À´Ï´Ù" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "¸í·ÉÀÌ ÁöÁ¤µÇÁö ¾Ê¾Ò½À´Ï´Ù" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 msgid "regular expression too large" msgstr "" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 msgid "POSIX collating elements are not supported" msgstr "" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 msgid "invalid repeat counts in {}" msgstr "" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "`!' °¡ Áߺ¹µÇ¾ú½À´Ï´Ù" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "ºÒÇÊ¿äÇÑ `,' °¡ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "ù¹øÂ° ÁÖ¼Ò·Î '+N' ¶Ç´Â '~N' À» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "`{' °¡ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "ºÒÇÊ¿äÇÑ `}' °¡ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "¸í·ÉµÚ¿¡ ÇÊ¿ä¾ø´Â ¹®ÀÚµéÀÌ ÀÖ½À´Ï´Ù" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' ¿¡ ¾î¶°ÇÑ ÁÖ¼Òµµ ÇÊ¿äÄ¡ ¾Ê½À´Ï´Ù" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": ¿¡ ¾î¶°ÇÑ ÁÖ¼Òµµ ÇÊ¿äÄ¡ ¾Ê½À´Ï´Ù" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "ÄÚ¸àÆ®¿¡ ¾î¶°ÇÑ ÁÖ¼Òµµ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "¸í·ÉÀÌ ÁöÁ¤µÇÁö ¾Ê¾Ò½À´Ï´Ù" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "¸í·É¿¡ ÇϳªÀÇ ÁÖ¼Ò¸¸ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "ÁÖ¼Ò Á¤±ÔÇ¥Çö½Ä Á¾·áµÇÁö ¾Ê¾Ò½À´Ï´Ù" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "`s' ¸í·ÉÀÌ Á¾·áµÇÁö ¾Ê¾Ò½À´Ï´Ù" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "`y' ¸í·ÉÀÌ Á¾·áµÇÁö ¾Ê¾Ò½À´Ï´Ù" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "`s' ¿¡ ¾Ë ¼ö ¾ø´Â ¿É¼ÇÀÌ ÀÖ½À´Ï´Ù" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "`s' ¸í·É¿¡ `p' ¿É¼ÇÀÌ Áߺ¹µÇ¾î ÀÖ½À´Ï´Ù" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "`s' ¸í·É¿¡ `g' ¿É¼ÇÀÌ Áߺ¹µÇ¾î ÀÖ½À´Ï´Ù" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "`s' ¸í·É¿¡ ¼ýÀÚ ¿É¼ÇÀÌ Áߺ¹µÇ¾î ÀÖ½À´Ï´Ù" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "`s' ¸í·ÉÀÇ ¼ýÀÚ ¿É¼Ç¿¡ '0' À» ÁöÁ¤ÇÒ ¼ö ¾ø½À´Ï´Ù" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "`y' ¸í·ÉÀÇ ¹®ÀÚ¿­ÀÌ ±æÀ̰¡ ´Ù¸¨´Ï´Ù" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "ÁÖ¼Ò º¯°æÀÚ(modifier)ÀÇ »ç¿ëÀÌ ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "¾Ë ¼ö ¾ø´Â ¸í·É:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: %s ÆÄÀÏÀÇ %lu ¹øÂ° ÁÙ: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e expression #%lu, char %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "`%s' (À¸)·Î Á¡ÇÁÇÒ ·¹À̺íÀ» ãÀ» ¼ö ¾ø½À´Ï´Ù" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: %s (À»)¸¦ ÀÐÀ» ¼ö ¾øÀ½: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "%s ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "%s ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "¹ö±×¸¦ º¸°íÇÒ E-mail ÁÖ¼Ò: %s .\n" "``Subject:'' Ç׸ñ¿¡ ¹Ýµå½Ã ``%s'' ´Ü¾î¸¦ Æ÷ÇÔÇØ Áֽñ⠹ٶø´Ï´Ù.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "ÀÌ ÇÁ·Î±×·¥Àº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î ÀÔ´Ï´Ù; ÀÚ¼¼ÇÑ ³»¿ëÀº ÀúÀÛ±Ç ³»¿ëÀÇ ¿ø¹®À»\n" "Âü°íÇϽñ⠹ٶø´Ï´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¹ý¿¡ ÀúÃ˵ÇÁö ¾Ê´Â ¹üÀ§¿¡¼­ »ó¾÷ÀûÀ̳ª\n" "Ư¼ö ¸ñÀûÀ¸·Î »ç¿ëµÉ °æ¿ì¸¦ Æ÷ÇÔÇÑ ¾î¶°ÇÑ °æ¿ì¿¡µµ º¸ÁõÇÏÁö ¾Ê½À´Ï´Ù.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: %s (À»)¸¦ ÀÐÀ» ¼ö ¾øÀ½: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "%s ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù" #: lib/utils.c:220 #, fuzzy, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "%2$s ¿¡ %1$d Ç׸ñ(item)À» ±â·ÏÇÒ ¼ö ¾ø½À´Ï´Ù: %3$s" msgstr[1] "%2$s ¿¡ %1$d Ç׸ñ(item)À» ±â·ÏÇÒ ¼ö ¾ø½À´Ï´Ù: %3$s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "%s ÀÇ ³»¿ë Àб⠿À·ù: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: %s (À»)¸¦ ÀÐÀ» ¼ö ¾øÀ½: %s\n" #, fuzzy #~ msgid "Unmatched [ or [^" #~ msgstr "`{' °¡ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù" #, fuzzy #~ msgid "Unmatched ( or \\(" #~ msgstr "`{' °¡ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù" #, fuzzy #~ msgid "Unmatched \\{" #~ msgstr "`{' °¡ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù" #, fuzzy #~ msgid "Unmatched ) or \\)" #~ msgstr "`{' °¡ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù" sed-3.62/po/nl.gmo0000644000076600007660000000542410176462004010714 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^…trúÑm'?g‚ «´ ` s ‘M § õ& % /% U& {. ¢ Ñ ì ÿ     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.9 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-04-09 21:39+0200 Last-Translator: Elros Cyriatan Language-Team: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=n != 1; -R, --regexp-perl de syntaxis van Perl 5 voor reguliere uitdrukkingen gebruiken in het script. %s Dit is vrije software; zie de bron voor kopieervoorwaarden. Er is GEEN garantie; zelfs niet voor VERHANDELBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL, tot het uiterste dat door de wet wordt toegestaan. %s: -e uitdrukking #%lu, teken %lu: %s %s: kan %s niet lezen: %s %s: bestand %s regel %lu: %s : wil geen adressenStuur foutrapporten naar: %s . Zorg ervoor dat het woord ``%s'' ergens in het ``Onderwerp:''-veld staat. Rapporteer fouten in de vertalingen bij . GNU sed versie %s `e'-opdracht niet ondersteund`}' wil geen adressenkon niet %d item naar %s schrijven: %skon niet %d item naar %s schrijven: %sfout in deelprocesverwachtte een nieuwere versie van sedmeerdere `g'-opties voor `s'-opdrachtmeerdere `p'-opties voor `s'-opdrachtmeerdere getalopties voor `s'-opdrachtgetaloptie voor `s'-opdracht mag niet nul zijnoptie `e' niet ondersteundleesfout op %s: %ssuper-sed versie %s sed-3.62/po/nl.po0000644000076600007660000003322110176462002010542 00000000000000# Dutch translation of sed. # Copyright (C) 2004 Free Software Foundation, Inc. # This file is distributed under the same license as the sed package. # Elros Cyriatan , 2004. # # msgid "" msgstr "" "Project-Id-Version: sed 4.0.9\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-04-09 21:39+0200\n" "Last-Translator: Elros Cyriatan \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Onbekende optie voor `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "leesfout op %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Ongeldige tekenklasse naam" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Niet-overeenkomende `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Onbekende optie voor `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Ontbrekende opdracht" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Reguliere uitdrukking te groot" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "optie `e' niet ondersteund" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Ongeldige inhoud van \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Meerdere `!'s" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Onverwachte `,'" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Kan niet +N of ~N als eerste adres gebruiken" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Niet-overeenkomende `{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Onverwachte `}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Extra tekens na opdracht" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Verwachtte \\ na `a', `c' of `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' wil geen adressen" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": wil geen adressen" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Opmerkingen accepteren geen adres" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Ontbrekende opdracht" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Opdracht gebruikt slechts één adres" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Niet-afgemaakt adres reguliere uitdrukking" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Niet-afgemaakte `s'-opdracht" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Niet-afgemaakte `y'-opdracht" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Onbekende optie voor `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "meerdere `p'-opties voor `s'-opdracht" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "meerdere `g'-opties voor `s'-opdracht" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "meerdere getalopties voor `s'-opdracht" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "getaloptie voor `s'-opdracht mag niet nul zijn" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "tekenreeksen voor `y'-opdracht zijn van verschillende lengte" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "verwachtte een nieuwere versie van sed" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Opdracht gebruikt slechts één adres" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Onbekende opdracht:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: bestand %s regel %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e uitdrukking #%lu, teken %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Kan label voor sprong naar `%s' niet vinden" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: kan %s niet lezen: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Kon bestand %s niet openen: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Kon tijdelijk bestand %s niet openen: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "fout in deelproces" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "optie `e' niet ondersteund" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "`e'-opdracht niet ondersteund" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Geen eerdere reguliere uitdrukking" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Kan geen veranderaars opgeven op lege reguliere uitdrukking" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Ongeldige verwijzing \\%d op rechterhandzijde van `s'-opdracht" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " de syntaxis van Perl 5 voor reguliere uitdrukkingen " "gebruiken in het script.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " de syntaxis van Perl 5 voor reguliere uitdrukkingen " "gebruiken in het script.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Stuur foutrapporten naar: %s .\n" "Zorg ervoor dat het woord ``%s'' ergens in het ``Onderwerp:''-veld staat.\n" "Rapporteer fouten in de vertalingen bij .\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed versie %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "gebaseerd op GNU sed versie 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versie %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Dit is vrije software; zie de bron voor kopieervoorwaarden. Er is GEEN\n" "garantie; zelfs niet voor VERHANDELBAARHEID of GESCHIKTHEID VOOR\n" "EEN BEPAALD DOEL, tot het uiterste dat door de wet wordt toegestaan.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: kan %s niet lezen: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Kon bestand %s niet openen: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "kon niet %d item naar %s schrijven: %s" msgstr[1] "kon niet %d item naar %s schrijven: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "leesfout op %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: kan %s niet lezen: %s\n" #~ msgid "Success" #~ msgstr "Succes" #~ msgid "No match" #~ msgstr "Geen overeenkomst" #~ msgid "Invalid regular expression" #~ msgstr "Ongeldige reguliere uitdrukking" #~ msgid "Invalid collation character" #~ msgstr "Ongeldig sorteerteken" #~ msgid "Trailing backslash" #~ msgstr "Backslash aan het einde" #~ msgid "Invalid back reference" #~ msgstr "Ongeldige terugverwijzing" #~ msgid "Unmatched [ or [^" #~ msgstr "Niet-overeenkomende [ of [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "Niet-overeenkomende ( of \\(" #~ msgid "Unmatched \\{" #~ msgstr "Niet-overeenkomende \\{" #~ msgid "Invalid range end" #~ msgstr "Ongeldig bereikeinde" #~ msgid "Memory exhausted" #~ msgstr "Geheugen uitgeput" #~ msgid "Invalid preceding regular expression" #~ msgstr "Ongeldige voorafgaande reguliere uitdrukking" #~ msgid "Premature end of regular expression" #~ msgstr "Vroegtijdig einde van reguliere uitdrukking" #~ msgid "Unmatched ) or \\)" #~ msgstr "Niet-overeenkomende ) of \\)" #~ msgid "No previous regular expression" #~ msgstr "Geen eerdere reguliere uitdrukking" sed-3.62/po/pl.gmo0000644000076600007660000002076110176462004010717 00000000000000•Þ?Y púq,l5™7Ï\`duÅl;b¨V Y b~ ¼ ;º Ë% † ¬ à Ýd ú _H s ¼ Ö õ!  5 J( _ ˆ# ¦ Ê$ ê#)BM2à ×ø*5*`‹« »#É#í&8,W„-²àö* @Ng€Ó›Yo8É8C;eeå•K¦ácˆdì]Q‚¯Ž2ÌÁ$޳ÒíenS Õö ,4ayC˜$Ü(+*1Vˆ,¨yÕ5O…&˜&¿æ;5?#u™«'À'è, ' =3 e ™ ¶. Ì û!!'!> !W!x!!«)!Ç20>3 ?, 91+$4:")7/.* 5#= -%< 6;&8('! If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. --help display this help and exit --version output version information and exit --posix disable all GNU extensions. -R, --regexp-perl use Perl 5's regular expressions syntax in the script. -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) -l N, --line-length=N specify the desired line-wrap length for the `l' command -n, --quiet, --silent suppress automatic printing of pattern space -r, --regexp-extended use extended regular expressions in the script. -s, --separate consider files as separate rather than as a single continuous long stream. -u, --unbuffered load minimal amounts of data from the input files and flush the output buffers more often %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]... `e' command not supported`}' doesn't want any addressesbased on GNU sed version %s can't find label for jump to `%s'cannot remove %s: %scannot rename %s: %scannot specify modifiers on empty regexpcommand only uses one addresscomments don't accept any addressescouldn't edit %s: is a terminalcouldn't edit %s: not a regular filecouldn't open file %s: %scouldn't open temporary file %s: %scouldn't write %d item to %s: %scouldn't write %d items to %s: %sdelimiter character is not a single-byte charactererror in subprocessexpected \ after `a', `c' or `i'expected newer version of sedextra characters after commandinvalid reference \%d on `s' command's RHSinvalid usage of +N or ~N as first addressinvalid usage of line address 0missing commandmultiple `!'smultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandno previous regular expressionnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %sstrings for `y' command are different lengthssuper-sed version %s unexpected `,'unexpected `}'unknown command: `%c'unknown option to `s'unmatched `{'unterminated `s' commandunterminated `y' commandunterminated address regexProject-Id-Version: sed 4.1.1 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-07-08 19:58+0200 Last-Translator: Wojciech Polak Language-Team: Polish MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-2 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); Je¿eli nie zostan± podane opcje -e, --expression, -f, lub --file, to wtedy pierwszy argument, który nie jest opcj± linii poleceñ sed, zostanie wziêty jako skrypt sed do przetworzenia. Wszystkie pozosta³e argumenty s± nazwami plików wej¶ciowych; je¿eli nie zostan± podane ¿adne pliki wej¶ciowe, to wtedy odczytane zostanie standardowe wej¶cie. --help wy¶wietla tê oto pomoc i koñczy pracê. --version wy¶wietla numer wersji i koñczy pracê. --posix wy³±cza wszystkie rozszerzenia GNU. -R, --regexp-perl u¿ywa w skrypcie wyra¿enia regularne zgodne ze sk³adni± Perl 5. -e skrypt, --expression=skrypt dodaje skrypt do poleceñ, które maj± byæ wykonane. -f plik-skryptowy, --file=plik-skryptowy dodaje zawarto¶æ pliku skryptowego do poleceñ, które maj± byæ wykonane. -i[rozszerzenie], --in-place[=rozszerzenie] edytuje pliki "w miejscu" (tworzy kopie zapasowe je¿eli zosta³o podane rozszerzenie). -l N, --line-length=N ustala po¿±dan± d³ugo¶æ ³amanych linii dla polecenia `l'. -n, --quiet, --silent powstrzymuje automatyczne drukowanie przetwarzanych linii. -r, --regexp-extended u¿ywa w skrypcie rozszerzonych wyra¿eñ regularnych. -s, --separate traktuje pliki jako oddzielne, a nie jako pojedynczy, d³ugi i ci±g³y strumieñ. -u, --unbuffered ³aduje minimaln± ilo¶æ danych z plików wej¶ciowych i czê¶ciej oczyszcza bufor wyj¶ciowy. %s Niniejszy program jest wolnym oprogramowaniem; warunki kopiowania s± opisane w ¼ród³ach. Autorzy nie daj± ¯ADNYCH gwarancji, w tym równie¿ gwarancji PRZYDATNO¦CI DO SPRZEDA¯Y LUB DO KONKRETNYCH CELÓW. %s: -e wyra¿enie #%lu, znak %lu: %s %s: nie mo¿na odczytaæ %s: %s %s: plik %s linia %lu: %s : nie chce ¿adnych adresówEwentualne b³êdy prosimy zg³aszaæ na adres: %s W tym celu proszê dodaæ s³owo ``%s'' do tematu listu. GNU sed wersja %s U¿ycie: %s [OPCJE] {skrypt-tylko-wtedy-gdy-¿aden-inny-skrypt} [plik-wej¶ciowy]... polecenie `e' nie jest wspierane`}' nie chce ¿adnych adresówna podstawie wersji GNU sed %s nie mo¿na znale¼æ etykiety dla skoku do `%s'nie mo¿na usun±æ %s: %snie mo¿na zmieniæ nazwy %s: %snie mo¿na wyszczególniæ modyfikatorów w pustym wyra¿eniu regularnympolecenie u¿ywa tylko jednego adresukomentarze nie akceptuj± ¿adnych adresównie mo¿na edytowaæ %s: plik jest terminalemnie mo¿na edytowaæ %s: to nie jest regularny pliknie mo¿na otworzyæ pliku %s: %snie mo¿na otworzyæ tymczasowego pliku %s: %snie mo¿na zapisaæ %d elementu do %s: %snie mo¿na zapisaæ %d elementów do %s: %snie mo¿na zapisaæ %d elementów do %s: %sznak ogranicznika nie jest pojedynczym znakiem-bajtemb³±d w podprocesieoczekiwano znaku \ po `a', `c' lub `i'oczekiwano nowszej wersji programu seddodatkowe znaki po poleceniunieprawid³owe odwo³anie \%d po prawej stronie polecenia `s'nieprawid³owe u¿ycie +N lub ~N jako pierwszego adresunieprawid³owe u¿ycie adresu linii 0brakuje poleceniawielokrotny znak `!'wielokrotne opcje `g' dla polecenia `s'wielokrotne opcje `p' dla polecenia `s'wielokrotne opcje liczbowe dla polecenia `s'brak poprzedniego wyra¿enia regularnegoopcja liczbowa dla polecenia `s' nie mo¿e byæ zeremopcja `e' nie jest wspieranab³±d odczytu w %s: %s³añcuchy dla polecenia `y' s± ró¿nych d³ugo¶cisuper-sed wersja %s nieoczekiwany znak `,'nieoczekiwany znak `}'nieznane polecenie: `%c'nieznana opcja dla polecenia `s'niedopasowany znak `{'niezakoñczone polecenie `s'niezakoñczone polecenie `y'niezakoñczony adres wyra¿enia regularnegosed-3.62/po/pl.po0000644000076600007660000003642510176462002010555 00000000000000# Polish translations for GNU sed package. # Copyright (C) 2003, 2004 Free Software Foundation, Inc. # Wojciech Polak , 2003, 2004. # corrections: Jakub Bogusz , 2003. # msgid "" msgstr "" "Project-Id-Version: sed 4.1.1\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-07-08 19:58+0200\n" "Last-Translator: Wojciech Polak \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "nieznana opcja dla polecenia `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "b³±d odczytu w %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Nieprawid³owa nazwa klasy znaku" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "niedopasowany znak `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "nieznana opcja dla polecenia `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "brakuje polecenia" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Wyra¿enie regularne jest zbyt du¿e" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "opcja `e' nie jest wspierana" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Nieprawid³owa zawarto¶æ \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 msgid "multiple `!'s" msgstr "wielokrotny znak `!'" #: sed/compile.c:163 msgid "unexpected `,'" msgstr "nieoczekiwany znak `,'" #: sed/compile.c:164 msgid "invalid usage of +N or ~N as first address" msgstr "nieprawid³owe u¿ycie +N lub ~N jako pierwszego adresu" #: sed/compile.c:165 msgid "unmatched `{'" msgstr "niedopasowany znak `{'" #: sed/compile.c:166 msgid "unexpected `}'" msgstr "nieoczekiwany znak `}'" #: sed/compile.c:167 msgid "extra characters after command" msgstr "dodatkowe znaki po poleceniu" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "oczekiwano znaku \\ po `a', `c' lub `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' nie chce ¿adnych adresów" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": nie chce ¿adnych adresów" #: sed/compile.c:171 msgid "comments don't accept any addresses" msgstr "komentarze nie akceptuj± ¿adnych adresów" #: sed/compile.c:172 msgid "missing command" msgstr "brakuje polecenia" #: sed/compile.c:173 msgid "command only uses one address" msgstr "polecenie u¿ywa tylko jednego adresu" #: sed/compile.c:174 msgid "unterminated address regex" msgstr "niezakoñczony adres wyra¿enia regularnego" #: sed/compile.c:175 msgid "unterminated `s' command" msgstr "niezakoñczone polecenie `s'" #: sed/compile.c:176 msgid "unterminated `y' command" msgstr "niezakoñczone polecenie `y'" #: sed/compile.c:177 msgid "unknown option to `s'" msgstr "nieznana opcja dla polecenia `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "wielokrotne opcje `p' dla polecenia `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "wielokrotne opcje `g' dla polecenia `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "wielokrotne opcje liczbowe dla polecenia `s'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "opcja liczbowa dla polecenia `s' nie mo¿e byæ zerem" #: sed/compile.c:182 msgid "strings for `y' command are different lengths" msgstr "³añcuchy dla polecenia `y' s± ró¿nych d³ugo¶ci" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "znak ogranicznika nie jest pojedynczym znakiem-bajtem" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "oczekiwano nowszej wersji programu sed" #: sed/compile.c:185 msgid "invalid usage of line address 0" msgstr "nieprawid³owe u¿ycie adresu linii 0" #: sed/compile.c:186 #, c-format msgid "unknown command: `%c'" msgstr "nieznane polecenie: `%c'" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: plik %s linia %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e wyra¿enie #%lu, znak %lu: %s\n" #: sed/compile.c:1644 #, c-format msgid "can't find label for jump to `%s'" msgstr "nie mo¿na znale¼æ etykiety dla skoku do `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: nie mo¿na odczytaæ %s: %s\n" #: sed/execute.c:672 #, c-format msgid "couldn't edit %s: is a terminal" msgstr "nie mo¿na edytowaæ %s: plik jest terminalem" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "nie mo¿na edytowaæ %s: to nie jest regularny plik" #: lib/utils.c:196 sed/execute.c:683 #, c-format msgid "couldn't open temporary file %s: %s" msgstr "nie mo¿na otworzyæ tymczasowego pliku %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "b³±d w podprocesie" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "opcja `e' nie jest wspierana" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "polecenie `e' nie jest wspierane" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "brak poprzedniego wyra¿enia regularnego" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "nie mo¿na wyszczególniæ modyfikatorów w pustym wyra¿eniu regularnym" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "nieprawid³owe odwo³anie \\%d po prawej stronie polecenia `s'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " u¿ywa w skrypcie wyra¿enia regularne zgodne ze sk³adni± " "Perl 5.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" "U¿ycie: %s [OPCJE] {skrypt-tylko-wtedy-gdy-¿aden-inny-skrypt} [plik-" "wej¶ciowy]...\n" "\n" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" " -n, --quiet, --silent\n" " powstrzymuje automatyczne drukowanie przetwarzanych linii.\n" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" " -e skrypt, --expression=skrypt\n" " dodaje skrypt do poleceñ, które maj± byæ wykonane.\n" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" " -f plik-skryptowy, --file=plik-skryptowy\n" " dodaje zawarto¶æ pliku skryptowego do poleceñ,\n" " które maj± byæ wykonane.\n" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" " -i[rozszerzenie], --in-place[=rozszerzenie]\n" " edytuje pliki \"w miejscu\" (tworzy kopie zapasowe\n" " je¿eli zosta³o podane rozszerzenie).\n" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" " -l N, --line-length=N\n" " ustala po¿±dan± d³ugo¶æ ³amanych linii dla polecenia `l'.\n" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" " --posix\n" " wy³±cza wszystkie rozszerzenia GNU.\n" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -r, --regexp-extended\n" " u¿ywa w skrypcie rozszerzonych wyra¿eñ regularnych.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" " -s, --separate\n" " traktuje pliki jako oddzielne, a nie jako pojedynczy,\n" " d³ugi i ci±g³y strumieñ.\n" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" " -u, --unbuffered\n" " ³aduje minimaln± ilo¶æ danych z plików wej¶ciowych\n" " i czê¶ciej oczyszcza bufor wyj¶ciowy.\n" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr " --help wy¶wietla tê oto pomoc i koñczy pracê.\n" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr " --version wy¶wietla numer wersji i koñczy pracê.\n" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" "\n" "Je¿eli nie zostan± podane opcje -e, --expression, -f, lub --file,\n" "to wtedy pierwszy argument, który nie jest opcj± linii poleceñ sed,\n" "zostanie wziêty jako skrypt sed do przetworzenia. Wszystkie pozosta³e\n" "argumenty s± nazwami plików wej¶ciowych; je¿eli nie zostan± podane\n" "¿adne pliki wej¶ciowe, to wtedy odczytane zostanie standardowe wej¶cie.\n" "\n" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Ewentualne b³êdy prosimy zg³aszaæ na adres: %s\n" "W tym celu proszê dodaæ s³owo ``%s'' do tematu listu.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed wersja %s\n" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "na podstawie wersji GNU sed %s\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed wersja %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Niniejszy program jest wolnym oprogramowaniem; warunki kopiowania s± " "opisane\n" "w ¼ród³ach. Autorzy nie daj± ¯ADNYCH gwarancji, w tym równie¿ gwarancji\n" "PRZYDATNO¦CI DO SPRZEDA¯Y LUB DO KONKRETNYCH CELÓW.\n" #: lib/utils.c:98 lib/utils.c:336 #, c-format msgid "cannot remove %s: %s" msgstr "nie mo¿na usun±æ %s: %s" #: lib/utils.c:143 #, c-format msgid "couldn't open file %s: %s" msgstr "nie mo¿na otworzyæ pliku %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "nie mo¿na zapisaæ %d elementu do %s: %s" msgstr[1] "nie mo¿na zapisaæ %d elementów do %s: %s" msgstr[2] "nie mo¿na zapisaæ %d elementów do %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "b³±d odczytu w %s: %s" #: lib/utils.c:341 #, c-format msgid "cannot rename %s: %s" msgstr "nie mo¿na zmieniæ nazwy %s: %s" #~ msgid "Success" #~ msgstr "Sukces" #~ msgid "No match" #~ msgstr "Brak dopasowania" #~ msgid "Invalid regular expression" #~ msgstr "Nieprawid³owe wyra¿enie regularne" #~ msgid "Invalid collation character" #~ msgstr "Nieprawid³owy znak porównania" #~ msgid "Trailing backslash" #~ msgstr "Koñcowy znak backslash" #~ msgid "Invalid back reference" #~ msgstr "Nieprawid³owe odwo³anie wsteczne" #~ msgid "Unmatched [ or [^" #~ msgstr "Niedopasowany znak [ lub [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "Niedopasowany znak ( lub \\(" #~ msgid "Unmatched \\{" #~ msgstr "Niedopasowany znak \\{" #~ msgid "Invalid range end" #~ msgstr "Nieprawid³owy koniec zakresu" #~ msgid "Memory exhausted" #~ msgstr "Pamiêæ wyczerpana" #~ msgid "Invalid preceding regular expression" #~ msgstr "Nieprawid³owe poprzedzaj±ce wyra¿enie regularne" #~ msgid "Premature end of regular expression" #~ msgstr "Przedwczesny koniec wyra¿enia regularnego" #~ msgid "Unmatched ) or \\)" #~ msgstr "Niedopasowany znak ) lub \\)" #~ msgid "No previous regular expression" #~ msgstr "Brak poprzedniego wyra¿enia regularnego" sed-3.62/po/pt_BR.gmo0000644000076600007660000000533610176462004011313 00000000000000•Þ¼\Ð\Ѻ.%é&@d]ÂÖðBR#f#Š&®,Õ0©F_ðØP)) St’p«  / I\ b ¿' Ó' û5 #= Y — ¯ É     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.1 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2002-11-08 17:44-0300 Last-Translator: Aurélio Marinho Jargas Language-Team: Brazilian Portuguese MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=(n > 1); -R, --regexp-perl usar sintaxe de expressões regulares do Perl 5 no script. %s Este programa é Software Livre. Veja os fontes para conhecer as condições de cópia. NÃO há garantias, nem mesmo para os aspectos mercantis ou de atendimento a finalidades específicas, tanto quanto a lei permita. %s: -e expressão #%lu, caractere %lu: %s %s: não foi possível ler %s: %s %s: arquivo %s linha %lu: %s `:' não recebe endereçosEnvie relatórios de erros (em inglês) para: %s . Inclua a palavra ``%s'' no campo ``Assunto:'' ou ``Subject:''. GNU sed versão %s comando `e' não suportado`}' não recebe endereçosnão foi possível escrever %d item para %s: %snão foi possível escrever %d items para %s: %serro no subprocessoopções `g' múltiplas para o comando `s'opções `p' múltiplas para o comando `s'opções numéricas múltiplas para o comando `s' (s///n)A opção numérica para o comando `s' não pode ser zero (s///0)opção `e' não suportadaerro de leitura em %s: %ssuper-sed versão %s sed-3.62/po/pt_BR.po0000644000076600007660000003367610176462002011155 00000000000000# traduções para o português do Brasil das mensagens de erro do sed # Copyright (C) 1999 Free Software Foundation, Inc. # Aurélio Marinho Jargas , 1999, 2002. # # Tradução original da versão 4.01: # Juan Carlos Castro y Castro , 2002. # msgid "" msgstr "" "Project-Id-Version: sed 4.0.1\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2002-11-08 17:44-0300\n" "Last-Translator: Aurélio Marinho Jargas \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Opção desconhecida para o comando `s' (s///?)" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "erro de leitura em %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Nome inválido de classe de caracteres" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "`{' não terminada" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Opção desconhecida para o comando `s' (s///?)" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Falta especificar um comando ao endereço" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Expressão regular grande demais" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "opção `e' não suportada" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Conteúdo inválido no \\{\\} (permitidos números e vírgula)" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Exclamações `!' múltiplas" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Vírgula `,' inesperada" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Não use +N ou ~N como o primeiro endereço" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "`{' não terminada" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "`}' inesperada" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Há caracteres sobrando após o comando" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Deve haver um escape \\ depois dos comandos `a', `c' e `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' não recebe endereços" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr "`:' não recebe endereços" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Comentários não aceitam endereços" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Falta especificar um comando ao endereço" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Este comando usa apenas um endereço" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "A expressão regular do endereço está inacabada (falta a /)" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Comando `s' inacabado (s/// - faltou delimitador)" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Comando `y' inacabado (y/// - faltou delimitador)" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Opção desconhecida para o comando `s' (s///?)" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "opções `p' múltiplas para o comando `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "opções `g' múltiplas para o comando `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "opções numéricas múltiplas para o comando `s' (s///n)" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "A opção numérica para o comando `s' não pode ser zero (s///0)" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "Os textos para o comando `y' têm tamanhos diferentes (y/abc/z/)" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Uso incorreto do modificador de endereço" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Comando desconhecido:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: arquivo %s linha %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e expressão #%lu, caractere %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Não foi possível encontrar a marcação `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: não foi possível ler %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Não foi possível abrir o arquivo %s: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Não foi possível abrir o arquivo %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "erro no subprocesso" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "opção `e' não suportada" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "comando `e' não suportado" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Não há expressão regular anterior" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Não é permitido especificar modificadores numa expressão regular vazia" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Referência inválida \\%d na segunda parte do comando `s'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " usar sintaxe de expressões regulares do Perl 5 no script.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " usar sintaxe de expressões regulares do Perl 5 no script.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Envie relatórios de erros (em inglês) para: %s .\n" "Inclua a palavra ``%s'' no campo ``Assunto:'' ou ``Subject:''.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed versão %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "baseado no GNU sed versão 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versão %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Este programa é Software Livre. Veja os fontes para conhecer as condições\n" "de cópia. NÃO há garantias, nem mesmo para os aspectos mercantis ou de\n" "atendimento a finalidades específicas, tanto quanto a lei permita.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: não foi possível ler %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Não foi possível abrir o arquivo %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "não foi possível escrever %d item para %s: %s" msgstr[1] "não foi possível escrever %d items para %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "erro de leitura em %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: não foi possível ler %s: %s\n" #~ msgid "Success" #~ msgstr "Sucesso" #~ msgid "No match" #~ msgstr "Nada encontrado" #~ msgid "Invalid regular expression" #~ msgstr "Expressão regular inválida" #~ msgid "Invalid collation character" #~ msgstr "Caractere de ordenação inválido" #~ msgid "Trailing backslash" #~ msgstr "Escape \\ no final" #~ msgid "Invalid back reference" #~ msgstr "Retrovisor \\n inválido" #~ msgid "Unmatched [ or [^" #~ msgstr "[ ou [^ não terminado" #~ msgid "Unmatched ( or \\(" #~ msgstr "( ou \\( não terminado" #~ msgid "Unmatched \\{" #~ msgstr "\\{ não terminado" #~ msgid "Invalid range end" #~ msgstr "Fim de intervalo (range) inválido" #~ msgid "Memory exhausted" #~ msgstr "Falta de memória" #~ msgid "Invalid preceding regular expression" #~ msgstr "Expressão regular anterior inválida" #~ msgid "Premature end of regular expression" #~ msgstr "Fim prematuro da expressão regular" #~ msgid "Unmatched ) or \\)" #~ msgstr ") or \\) inesperado" #~ msgid "No previous regular expression" #~ msgstr "Não há expressão regular anterior" sed-3.62/po/quot.sed0000644000076600007660000000023110143704211011244 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g sed-3.62/po/ro.gmo0000644000076600007660000000540610176462004010723 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^¦taÌ})JtŒ«fà * @ [N u Ä) Ø' ' *, R6  ¶ Ò î     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.8 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2003-11-22 12:00-0500 Last-Translator: Laurentiu Buzdugan Language-Team: Romanian MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-2 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=(n != 1); -R, --regexp-perl foloseºte sintaxa expresiilor regulare din Perl 5 în script. %s Acesta este software liber; vedeþi codul sursã pentru condiþiile de copiere. Nu existã NICI o garanþie; nici mãcar pentru VANDABILITATE sau POTRIVIRE PENTRU UN ANUME SCOP, conform legilor în vigoare. %s: -e expresia #%lu, caracterul %lu: %s %s: nu pot citi %s: %s %s: fiºierul %s linia %lu: %s : nu vrea nici o adresãRaportaþi bug-uri prin e-mail la: %s . Fiþi siguri cã includeþi ``%s'' undeva în câmpul ``Subject:''. GNU sed versiunea %s comanda `e' nu e suportatã`}' nu vrea nici o adresãNu am putut scrie %d articol în %s: %sNu am putut scrie %d articole în %s: %seroare în subprocesam aºteptat o versiune mai recentã de sedmultiple opþiuni `g' pentru comanda `s'multiple opþiuni `p' pentru comanda `s'numãr multiplu de opþiuni pentru comanda `s'numãrul de opþiuni pentru comanda `s' nu poate fi zeroopþiunea `e' nu e suportatãeroare citire pentru %s: %sversiunea super-sed %s sed-3.62/po/ro.po0000644000076600007660000003310310176462002010550 00000000000000# Mesajele în limba românã pentru sed. # Copyright (C) 2003 Free Software Foundation, Inc. # Acest fiºier este distribuit sub aceeaºi licenþã ca ºi pachetul sed. # Laurentiu Buzdugan , 2003. # # msgid "" msgstr "" "Project-Id-Version: sed 4.0.8\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2003-11-22 12:00-0500\n" "Last-Translator: Laurentiu Buzdugan \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Opþiune necunoscutã pentru `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "eroare citire pentru %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Nume de clasã de caractere incorect" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "`{' fãrã pereche" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Opþiune necunoscutã pentru `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Comandã absentã" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Expresie regularã prea mare" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "opþiunea `e' nu e suportatã" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Conþinut incorect pentru \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "`!'-uri multiple" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "`,' neaºteptat" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Nu se poate folosi +N ºi ~N ca prima adresã" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "`{' fãrã pereche" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "`}' neaºteptat" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Extra caractere dupã comandã" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Este aºteptat \\ dupã `a', `c' sau `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' nu vrea nici o adresã" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": nu vrea nici o adresã" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Comentariile nu acceptã nici o adresã" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Comandã absentã" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Comanda foloseºte numai o adresã" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Adresã regex neterminatã" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Comandã `s' neterminatã" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Comandã `y' neterminatã" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Opþiune necunoscutã pentru `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "multiple opþiuni `p' pentru comanda `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "multiple opþiuni `g' pentru comanda `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "numãr multiplu de opþiuni pentru comanda `s'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "numãrul de opþiuni pentru comanda `s' nu poate fi zero" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "ºirurile pentru comanda y au lungimi diferite" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "am aºteptat o versiune mai recentã de sed" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Comanda foloseºte numai o adresã" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Comandã necunoscutã:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: fiºierul %s linia %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e expresia #%lu, caracterul %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Nu pot gãsi eticheta pentru saltul la `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: nu pot citi %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Nu am putut deschide fiºierul %s: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Nu am putut deschide fiºierul temporar %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "eroare în subproces" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "opþiunea `e' nu e suportatã" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "comanda `e' nu e suportatã" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Nici o expresie regularã anterioarã" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Nu se pot specifica modificatori pentru regexp vidã" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Referinþã invalidã \\%d pentru RHS-ul comanzii `s'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " foloseºte sintaxa expresiilor regulare din Perl 5 în " "script.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " foloseºte sintaxa expresiilor regulare din Perl 5 în " "script.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Raportaþi bug-uri prin e-mail la: %s .\n" "Fiþi siguri cã includeþi ``%s'' undeva în câmpul ``Subject:''.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "versiunea super-sed %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "bazat pe GNU sed versiunea 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed versiunea %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Acesta este software liber; vedeþi codul sursã pentru condiþiile de " "copiere.\n" "Nu existã NICI o garanþie; nici mãcar pentru VANDABILITATE sau POTRIVIRE \n" "PENTRU UN ANUME SCOP, conform legilor în vigoare.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: nu pot citi %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Nu am putut deschide fiºierul %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "Nu am putut scrie %d articol în %s: %s" msgstr[1] "Nu am putut scrie %d articole în %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "eroare citire pentru %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: nu pot citi %s: %s\n" #~ msgid "Success" #~ msgstr "Succes" #~ msgid "No match" #~ msgstr "Nici o potrivire" #~ msgid "Invalid regular expression" #~ msgstr "Expresie regularã incorectã" #~ msgid "Invalid collation character" #~ msgstr "Colaþiune de caractere incorectã" #~ msgid "Trailing backslash" #~ msgstr "Backslash în coadã" #~ msgid "Invalid back reference" #~ msgstr "Referinþã înapoi incorectã" #~ msgid "Unmatched [ or [^" #~ msgstr "[ sau [^ fãrã pereche" #~ msgid "Unmatched ( or \\(" #~ msgstr "( sau \\( fãrã pereche" #~ msgid "Unmatched \\{" #~ msgstr "\\{ fãrã pereche" #~ msgid "Invalid range end" #~ msgstr "Sfârºit de interval incorect" #~ msgid "Memory exhausted" #~ msgstr "Memorie epuizatã" #~ msgid "Invalid preceding regular expression" #~ msgstr "Expresie regularã precedentã incorectã" #~ msgid "Premature end of regular expression" #~ msgstr "Sfârºit prematur al expresiei regulare" #~ msgid "Unmatched ) or \\)" #~ msgstr ") sau \\) fãrã pereche" #~ msgid "No previous regular expression" #~ msgstr "Nici o expresie regularã anterioarã" sed-3.62/po/ru.gmo0000644000076600007660000002047010176462004010727 00000000000000•Þ?Y púq,l5™7Ï\`duÅl;b¨V Y b~ ¼ ;º Ë% † ¬ à Ýd ú _H s ¼ Ö õ!  5 J( _ ˆ# ¦ Ê$ ê#)BM2à ×ø*5*`‹« »#É#í&8,W„-²àö* @Ng€›),-3Z;ŽeÊ[0qŒ}þd|Wác9„™"¼&Î õ,2n_ÎYá;,Y†*¥Ðê= $H4m)¢0Ìý(QE4—Ì"á %*B=m*«Öê**,/W%‡:­è )  C X r Œ ¦ Ä Ø ò+! 20>3 ?, 91+$4:")7/.* 5#= -%< 6;&8('! If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. --help display this help and exit --version output version information and exit --posix disable all GNU extensions. -R, --regexp-perl use Perl 5's regular expressions syntax in the script. -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) -l N, --line-length=N specify the desired line-wrap length for the `l' command -n, --quiet, --silent suppress automatic printing of pattern space -r, --regexp-extended use extended regular expressions in the script. -s, --separate consider files as separate rather than as a single continuous long stream. -u, --unbuffered load minimal amounts of data from the input files and flush the output buffers more often %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]... `e' command not supported`}' doesn't want any addressesbased on GNU sed version %s can't find label for jump to `%s'cannot remove %s: %scannot rename %s: %scannot specify modifiers on empty regexpcommand only uses one addresscomments don't accept any addressescouldn't edit %s: is a terminalcouldn't edit %s: not a regular filecouldn't open file %s: %scouldn't open temporary file %s: %scouldn't write %d item to %s: %scouldn't write %d items to %s: %sdelimiter character is not a single-byte charactererror in subprocessexpected \ after `a', `c' or `i'expected newer version of sedextra characters after commandinvalid reference \%d on `s' command's RHSinvalid usage of +N or ~N as first addressinvalid usage of line address 0missing commandmultiple `!'smultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandno previous regular expressionnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %sstrings for `y' command are different lengthssuper-sed version %s unexpected `,'unexpected `}'unknown command: `%c'unknown option to `s'unmatched `{'unterminated `s' commandunterminated `y' commandunterminated address regexProject-Id-Version: sed-4.1.1 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-07-07 17:54+0300 Last-Translator: Pavel Maryanov Language-Team: Russian MIME-Version: 1.0 Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=n>1; X-Generator: KBabel 1.3 åÓÌÉ ÏÐÃÉÑ -e, --expression, -f, ÉÌÉ --file ÎÅ ÕËÁÚÁÎÁ, ÔÏÇÄÁ ÐÅÒ×ÙÊ ÎÅÏÐÃÉÏÎÁÌØÎÙÊ ÁÒÇÕÍÅÎÔ ÂÅÒÅÔÓÑ ËÁË ÓËÒÉÐÔ sed ÄÌÑ ÉÎÔÅÒÐÒÅÔÁÃÉÉ. ÷ÓÅ ÏÓÔÁ×ÛÉÅÓÑ ÁÒÇÕÍÅÎÔÙ Ñ×ÌÑÀÔÓÑ ÉÍÅÎÁÍÉ ×ÈÏÄÎÙÈ ÆÁÊÌÏ×; ÅÓÌÉ ×ÈÏÄÎÙÅ ÆÁÊÌÙ ÎÅ ÕËÁÚÁÎÙ, ÔÏÇÄÁ ÞÉÔÁÅÔÓÑ ÓÔÁÎÔÁÒÔÎÙÊ ××ÏÄ. --help ×Ù×ÏÄ ÜÔÏÊ ÓÐÒÁ×ËÉ É ×ÙÈÏÄ --version ×Ù×ÏÄ ÉÎÆÏÒÍÁÃÉÉ Ï ×ÅÒÓÉÉ É ×ÙÈÏÄ --posix ÏÔËÌÀÞÅÎÉÅ ×ÓÅÈ ÒÁÓÛÉÒÅÎÉÊ GNU. -R, --regexp-perl ÉÓÐÏÌØÚÏ×ÁÎÉÅ × ÓËÒÉÐÔÅ ÓÉÎÔÁËÓÉÓÁ ÒÅÇÕÌÑÒÎÙÈ ×ÙÒÁÖÅÎÉÊ Perl 5. -e script, --expression=script ÄÏÂÁ×ÌÅÎÉÅ ÓËÒÉÐÔÁ × ÉÓÐÏÌÎÑÅÍÙÅ ËÏÍÁÎÄÙ -f script-file, --file=script-file ÄÏÂÁ×ÌÅÎÉÅ ÓÏÄÅÒÖÉÍÏÇÏ ÆÁÊÌÁ-ÓËÒÉÐÔÁ × ÉÓÐÏÌÎÑÅÍÙÅ ËÏÍÁÎÄÙ -i[óõææéëó], --in-place[=óõææéëó] ÒÅÄÁËÔÉÒÏ×ÁÎÉÅ ÆÁÊÌÏ× ÎÁ ÍÅÓÔÅ (ÓÏÚÄÁÅÔ ËÏÐÉÀ, ÅÓÌÉ ÕËÁÚÁÎÏ ÒÁÓÛÉÒÅÎÉÅ) -l N, --line-length=N ÕËÁÚÁÎÉÅ ÖÅÌÁÅÍÏÊ ÄÌÉÎÙ ÐÅÒÅÎÏÓÉÍÏÊ ÓÔÒÏËÉ ÄÌÑ ËÏÍÁÎÄÙ `l' -n, --quiet, --silent ÐÏÄÁ×ÌÅÎÉÅ Á×ÔÏÍÁÔÉÞÅÓËÏÇÏ ×Ù×ÏÄÁ ÐÒÏÍÅÖÕÔËÏ× -r, --regexp-extended ÉÓÐÏÌØÚÏ×ÁÎÉÅ × ÓËÒÉÐÔÅ ÒÁÓÛÉÒÅÎÎÙÈ ÒÅÇÕÌÑÒÎÙÈ ×ÙÒÁÖÅÎÉÊ. -s, --separate ÄÏÐÕÝÅÎÉÅ, ÞÔÏ ÆÁÊÌÙ ÒÁÚÄÅÌÅÎÙ, Á ÎÅ × ×ÉÄÅ ÏÄÎÏÇÏ ÄÌÉÎÎÏÇÏ ÎÅÐÒÅÒÙ×ÎÏÇÏ ÐÏÔÏËÁ. -u, --unbuffered ÚÁÇÒÕÚËÁ ÍÉÎÉÍÁÌØÎÏÇÏ ÏÂßÅÍÁ ÄÁÎÎÙÈ ÉÚ ×ÈÏÄÎÙÈ ÆÁÊÌÏ× É ÂÏÌÅÅ ÞÁÓÔÙÊ ÓÂÒÏÓ ÎÁ ÄÉÓË ×ÙÈÏÄÎÙÈ ÂÕÆÅÒÏ× %s üÔÏ Ó×ÏÂÏÄÎÏÅ ÐÒÏÇÒÁÍÍÎÏÅ ÏÂÅÓÐÅÞÅÎÉÅ; ÕÓÌÏ×ÉÑ ÅÇÏ ËÏÐÉÒÏ×ÁÎÉÑ ÓÍÏÔÒÉÔÅ × ÉÓÈÏÄÎÙÈ ÔÅËÓÔÁÈ. îÅ ÐÒÅÄÏÓÔÁ×ÌÑÅÔÓÑ îéëáëïê ÇÁÒÁÎÔÉÉ; ÄÁÖÅ ÇÁÒÁÎÔÉÉ ðòéçïäîïóôé äìñ ðòïäáöé ÉÌÉ ðòéíåîéíïóôé äìñ ëïîëòåôîïê ãåìé, × ÔÏÊ ÍÅÒÅ, × ËÏÔÏÒÏÊ ÜÔÏ ÍÏÖÅÔ ÂÙÔØ ÄÏÐÕÝÅÎÏ ÚÁËÏÎÏÄÁÔÅÌØÓÔ×ÏÍ. %s: -e ×ÙÒÁÖÅÎÉÅ #%lu, ÓÉÍ×ÏÌ %lu: %s %s: ÎÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÉÔÁÔØ %s: %s %s: ÆÁÊÌ %s ÓÔÒÏËÁ %lu: %s `:' ÎÅ ÄÏÐÕÓËÁÅÔ ÕËÁÚÁÎÉÑ ËÁËÉÈ-ÌÉÂÏ ÁÄÒÅÓÏ×ïÔÞÅÔÙ Ï ÏÛÉÂËÁÈ ÏÔÐÒÁ×ÌÑÊÔÅ ÐÏ ÁÄÒÅÓÕ: %s . õÂÅÄÉÔÅÓØ, ÞÔÏ ×ËÌÀÞÉÌÉ ÇÄÅ-ÌÉÂÏ × ÐÏÌÅ ``ôÅÍÁ:'' ÓÌÏ×Ï ``%s''. GNU sed ×ÅÒÓÉÑ %s éÓÐÏÌØÚÏ×ÁÎÉÅ: %s [ïðãéñ]... {ÔÏÌØËÏ-ÓËÒÉÐÔ-ÅÓÌÉ-ÎÅÔ-ÄÒÕÇÏÇÏ-ÓËÒÉÐÔÁ} [×ÈÏÄÎÏÊ-ÆÁÊÌ]... ËÏÍÁÎÄÁ `e' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ`}' ÎÅ ÄÏÐÕÓËÁÅÔ ÕËÁÚÁÎÉÑ ËÁËÉÈ-ÌÉÂÏ ÁÄÒÅÓÏ×ÏÓÎÏ×ÁÎ ÎÁ GNU sed ×ÅÒÓÉÉ %s ÎÅ×ÏÚÍÏÖÎÏ ÎÁÊÔÉ ÍÅÔËÕ ÄÌÑ ÐÅÒÅÈÏÄÁ Ë `%s'ÎÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ %s: %sÎÅ×ÏÚÍÏÖÎÏ ÐÅÒÅÉÍÅÎÏ×ÁÔØ %s: %sÎÅ×ÏÚÍÏÖÎÏ ÕËÁÚÁÔØ ÍÏÄÉÆÉËÁÔÏÒÙ × ÐÕÓÔÏÍ ÒÅÇÕÌÑÒÎÏÍ ×ÙÒÁÖÅÎÉÉËÏÍÁÎÄÁ ÉÓÐÏÌØÚÕÅÔ ÔÏÌØËÏ ÏÄÉÎ ÁÄÒÅÓËÏÍÍÅÎÔÁÒÉÉ ÎÅ ÄÏÐÕÓËÁÀÔ ÕËÁÚÁÎÉÑ ËÁËÉÈ-ÌÉÂÏ ÁÄÒÅÓÏ×ÎÅ×ÏÚÍÏÖÎÏ ÒÅÄÁËÔÉÒÏ×ÁÔØ %s: ÜÔÏ ÔÅÒÍÉÎÁÌÎÅ×ÏÚÍÏÖÎÏ ÒÅÄÁËÔÉÒÏ×ÁÔØ %s: ÜÔÏ ÎÅ ÏÂÙÞÎÙÊ ÆÁÊÌÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÆÁÊÌ %s: %sÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ×ÒÅÍÅÎÎÙÊ ÆÁÊÌ %s: %sÎÅ×ÏÚÍÏÖÎÏ ÚÁÐÉÓÁÔØ %d ÜÌÅÍÅÎÔ × %s: %sÎÅ×ÏÚÍÏÖÎÏ ÚÁÐÉÓÁÔØ %d ÜÌÅÍÅÎÔÏ× × %s: %sÓÉÍ×ÏÌ-ÒÁÚÄÅÌÉÔÅÌØ ÎÅ Ñ×ÌÑÅÔÓÑ ÏÄÎÏÂÁÊÔÏ×ÙÍ ÓÉÍ×ÏÌÏÍÏÛÉÂËÁ × ÐÏÄÐÒÏÃÅÓÓÅÏÖÉÄÁÌÁÓØ \ ÐÏÓÌÅ `a', `c' ÉÌÉ `i'ÏÖÉÄÁÌÁÓØ ÂÏÌÅÅ ÎÏ×ÁÑ ×ÅÒÓÉÑ sedÌÉÛÎÉÅ ÓÉÍ×ÏÌÙ ÐÏÓÌÅ ËÏÍÁÎÄÙÎÅÄÏÐÕÓÔÉÍÁÑ ÓÓÙÌËÁ \%d ÎÁ RHS ËÏÍÁÎÄÙ `s'ÉÓÐÏÌØÚÏ×ÁÎÉÅ +N ÉÌÉ ~N × ËÁÞÅÓÔ×Å ÐÅÒ×ÏÇÏ ÁÄÒÅÓÁ ÎÅÄÏÐÕÓÔÉÍÏÎÅÄÏÐÕÓÔÉÍÏÅ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÓÔÒÏËÉ ÁÄÒÅÓÁ 0ÏÔÓÕÔÓÔ×ÕÅÔ ËÏÍÁÎÄÁÎÅÓËÏÌØËÏ ÓÉÍ×ÏÌÏ× `!'ÎÅÓËÏÌØËÏ ÍÏÄÉÆÉËÁÔÏÒÏ× `g' Ó ËÏÍÁÎÄÏÊ `s'ÎÅÓËÏÌØËÏ ÍÏÄÉÆÉËÁÔÏÒÏ× `p' Ó ËÏÍÁÎÄÏÊ `s'ÎÅÓËÏÌØËÏ ÞÉÓÌÏ×ÙÈ ÍÏÄÉÆÉËÁÔÏÒÏ× Ó ËÏÍÁÎÄÏÊ `s'ÎÅÔ ÐÒÅÄÙÄÕÝÅÇÏ ÒÅÇÕÌÑÒÎÏÇÏ ×ÙÒÁÖÅÎÉÑÞÉÓÌÏ×ÏÊ ÍÏÄÉÆÉËÁÔÏÒ ÄÌÑ ËÏÍÁÎÄÙ `s' ÎÅ ÍÏÖÅÔ ÂÙÔØ ÎÕÌÅ×ÙÍÏÐÃÉÑ `e' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑÏÛÉÂËÁ ÞÔÅÎÉÑ %s: %sÓÔÒÏËÉ ÄÌÑ ËÏÍÁÎÄÙ `y' ÉÍÅÀÔ ÒÁÚÎÕÀ ÄÌÉÎÕsuper-sed ×ÅÒÓÉÑ %s ÎÅÐÒÅÄ×ÉÄÅÎÎÙÊ ÓÉÍ×ÏÌ `,'ÎÅÐÒÅÄ×ÉÄÅÎÎÙÊ ÓÉÍ×ÏÌ `}'ÎÅÉÚ×ÅÓÔÎÁÑ ËÏÍÁÎÄÁ: `%c'ÎÅÉÚ×ÅÓÔÎÙÊ ÍÏÄÉÆÉËÁÔÏÒ Ë `s'ÎÅÐÁÒÎÙÊ ÓÉÍ×ÏÌ `{'ÎÅÚÁ×ÅÒÛÅÎÎÁÑ ËÏÍÁÎÄÁ `s'ÎÅÚÁ×ÅÒÛÅÎÎÁÑ ËÏÍÁÎÄÁ `y'ÎÅÚÁ×ÅÒÛÅÎÎÏÅ ÁÄÒÅÓÎÏÅ ÒÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅsed-3.62/po/ru.po0000644000076600007660000003607210176462003010567 00000000000000# Translation of sed-4.1.1.po to Russian # Copyright (C) 1998, 2004 Free Software Foundation, Inc. # Const Kaplinsky , 1998. # Pavel Maryanov , 2004. # msgid "" msgstr "" "Project-Id-Version: sed-4.1.1\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-07-07 17:54+0300\n" "Last-Translator: Pavel Maryanov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=KOI8-R\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=n>1;\n" "X-Generator: KBabel 1.3\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "ÎÅÉÚ×ÅÓÔÎÙÊ ÍÏÄÉÆÉËÁÔÏÒ Ë `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "ÏÛÉÂËÁ ÞÔÅÎÉÑ %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "îÅÄÏÐÕÓÔÉÍÏÅ ÉÍÑ ÄÌÑ ËÌÁÓÓÁ ÓÉÍ×ÏÌÁ" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "ÎÅÐÁÒÎÙÊ ÓÉÍ×ÏÌ `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "ÎÅÉÚ×ÅÓÔÎÙÊ ÍÏÄÉÆÉËÁÔÏÒ Ë `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "ÏÔÓÕÔÓÔ×ÕÅÔ ËÏÍÁÎÄÁ" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "òÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ ÓÌÉÛËÏÍ ÂÏÌØÛÏÅ" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "ÏÐÃÉÑ `e' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "îÅÄÏÐÕÓÔÉÍÏÅ ÓÏÄÅÒÖÉÍÏÅ × \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 msgid "multiple `!'s" msgstr "ÎÅÓËÏÌØËÏ ÓÉÍ×ÏÌÏ× `!'" #: sed/compile.c:163 msgid "unexpected `,'" msgstr "ÎÅÐÒÅÄ×ÉÄÅÎÎÙÊ ÓÉÍ×ÏÌ `,'" #: sed/compile.c:164 msgid "invalid usage of +N or ~N as first address" msgstr "ÉÓÐÏÌØÚÏ×ÁÎÉÅ +N ÉÌÉ ~N × ËÁÞÅÓÔ×Å ÐÅÒ×ÏÇÏ ÁÄÒÅÓÁ ÎÅÄÏÐÕÓÔÉÍÏ" #: sed/compile.c:165 msgid "unmatched `{'" msgstr "ÎÅÐÁÒÎÙÊ ÓÉÍ×ÏÌ `{'" #: sed/compile.c:166 msgid "unexpected `}'" msgstr "ÎÅÐÒÅÄ×ÉÄÅÎÎÙÊ ÓÉÍ×ÏÌ `}'" #: sed/compile.c:167 msgid "extra characters after command" msgstr "ÌÉÛÎÉÅ ÓÉÍ×ÏÌÙ ÐÏÓÌÅ ËÏÍÁÎÄÙ" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "ÏÖÉÄÁÌÁÓØ \\ ÐÏÓÌÅ `a', `c' ÉÌÉ `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' ÎÅ ÄÏÐÕÓËÁÅÔ ÕËÁÚÁÎÉÑ ËÁËÉÈ-ÌÉÂÏ ÁÄÒÅÓÏ×" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr "`:' ÎÅ ÄÏÐÕÓËÁÅÔ ÕËÁÚÁÎÉÑ ËÁËÉÈ-ÌÉÂÏ ÁÄÒÅÓÏ×" #: sed/compile.c:171 msgid "comments don't accept any addresses" msgstr "ËÏÍÍÅÎÔÁÒÉÉ ÎÅ ÄÏÐÕÓËÁÀÔ ÕËÁÚÁÎÉÑ ËÁËÉÈ-ÌÉÂÏ ÁÄÒÅÓÏ×" #: sed/compile.c:172 msgid "missing command" msgstr "ÏÔÓÕÔÓÔ×ÕÅÔ ËÏÍÁÎÄÁ" #: sed/compile.c:173 msgid "command only uses one address" msgstr "ËÏÍÁÎÄÁ ÉÓÐÏÌØÚÕÅÔ ÔÏÌØËÏ ÏÄÉÎ ÁÄÒÅÓ" #: sed/compile.c:174 msgid "unterminated address regex" msgstr "ÎÅÚÁ×ÅÒÛÅÎÎÏÅ ÁÄÒÅÓÎÏÅ ÒÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ" #: sed/compile.c:175 msgid "unterminated `s' command" msgstr "ÎÅÚÁ×ÅÒÛÅÎÎÁÑ ËÏÍÁÎÄÁ `s'" #: sed/compile.c:176 msgid "unterminated `y' command" msgstr "ÎÅÚÁ×ÅÒÛÅÎÎÁÑ ËÏÍÁÎÄÁ `y'" #: sed/compile.c:177 msgid "unknown option to `s'" msgstr "ÎÅÉÚ×ÅÓÔÎÙÊ ÍÏÄÉÆÉËÁÔÏÒ Ë `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "ÎÅÓËÏÌØËÏ ÍÏÄÉÆÉËÁÔÏÒÏ× `p' Ó ËÏÍÁÎÄÏÊ `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "ÎÅÓËÏÌØËÏ ÍÏÄÉÆÉËÁÔÏÒÏ× `g' Ó ËÏÍÁÎÄÏÊ `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "ÎÅÓËÏÌØËÏ ÞÉÓÌÏ×ÙÈ ÍÏÄÉÆÉËÁÔÏÒÏ× Ó ËÏÍÁÎÄÏÊ `s'" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "ÞÉÓÌÏ×ÏÊ ÍÏÄÉÆÉËÁÔÏÒ ÄÌÑ ËÏÍÁÎÄÙ `s' ÎÅ ÍÏÖÅÔ ÂÙÔØ ÎÕÌÅ×ÙÍ" #: sed/compile.c:182 msgid "strings for `y' command are different lengths" msgstr "ÓÔÒÏËÉ ÄÌÑ ËÏÍÁÎÄÙ `y' ÉÍÅÀÔ ÒÁÚÎÕÀ ÄÌÉÎÕ" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "ÓÉÍ×ÏÌ-ÒÁÚÄÅÌÉÔÅÌØ ÎÅ Ñ×ÌÑÅÔÓÑ ÏÄÎÏÂÁÊÔÏ×ÙÍ ÓÉÍ×ÏÌÏÍ" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "ÏÖÉÄÁÌÁÓØ ÂÏÌÅÅ ÎÏ×ÁÑ ×ÅÒÓÉÑ sed" #: sed/compile.c:185 msgid "invalid usage of line address 0" msgstr "ÎÅÄÏÐÕÓÔÉÍÏÅ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÓÔÒÏËÉ ÁÄÒÅÓÁ 0" #: sed/compile.c:186 #, c-format msgid "unknown command: `%c'" msgstr "ÎÅÉÚ×ÅÓÔÎÁÑ ËÏÍÁÎÄÁ: `%c'" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: ÆÁÊÌ %s ÓÔÒÏËÁ %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e ×ÙÒÁÖÅÎÉÅ #%lu, ÓÉÍ×ÏÌ %lu: %s\n" #: sed/compile.c:1644 #, c-format msgid "can't find label for jump to `%s'" msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÎÁÊÔÉ ÍÅÔËÕ ÄÌÑ ÐÅÒÅÈÏÄÁ Ë `%s'" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: ÎÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÉÔÁÔØ %s: %s\n" #: sed/execute.c:672 #, c-format msgid "couldn't edit %s: is a terminal" msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÒÅÄÁËÔÉÒÏ×ÁÔØ %s: ÜÔÏ ÔÅÒÍÉÎÁÌ" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÒÅÄÁËÔÉÒÏ×ÁÔØ %s: ÜÔÏ ÎÅ ÏÂÙÞÎÙÊ ÆÁÊÌ" #: lib/utils.c:196 sed/execute.c:683 #, c-format msgid "couldn't open temporary file %s: %s" msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ×ÒÅÍÅÎÎÙÊ ÆÁÊÌ %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "ÏÛÉÂËÁ × ÐÏÄÐÒÏÃÅÓÓÅ" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "ÏÐÃÉÑ `e' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "ËÏÍÁÎÄÁ `e' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "ÎÅÔ ÐÒÅÄÙÄÕÝÅÇÏ ÒÅÇÕÌÑÒÎÏÇÏ ×ÙÒÁÖÅÎÉÑ" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÕËÁÚÁÔØ ÍÏÄÉÆÉËÁÔÏÒÙ × ÐÕÓÔÏÍ ÒÅÇÕÌÑÒÎÏÍ ×ÙÒÁÖÅÎÉÉ" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "ÎÅÄÏÐÕÓÔÉÍÁÑ ÓÓÙÌËÁ \\%d ÎÁ RHS ËÏÍÁÎÄÙ `s'" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " ÉÓÐÏÌØÚÏ×ÁÎÉÅ × ÓËÒÉÐÔÅ ÓÉÎÔÁËÓÉÓÁ ÒÅÇÕÌÑÒÎÙÈ ×ÙÒÁÖÅÎÉÊ " "Perl 5.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s [ïðãéñ]... {ÔÏÌØËÏ-ÓËÒÉÐÔ-ÅÓÌÉ-ÎÅÔ-ÄÒÕÇÏÇÏ-ÓËÒÉÐÔÁ} " "[×ÈÏÄÎÏÊ-ÆÁÊÌ]...\n" "\n" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" " -n, --quiet, --silent\n" " ÐÏÄÁ×ÌÅÎÉÅ Á×ÔÏÍÁÔÉÞÅÓËÏÇÏ ×Ù×ÏÄÁ ÐÒÏÍÅÖÕÔËÏ×\n" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" " -e script, --expression=script\n" " ÄÏÂÁ×ÌÅÎÉÅ ÓËÒÉÐÔÁ × ÉÓÐÏÌÎÑÅÍÙÅ ËÏÍÁÎÄÙ\n" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" " -f script-file, --file=script-file\n" " ÄÏÂÁ×ÌÅÎÉÅ ÓÏÄÅÒÖÉÍÏÇÏ ÆÁÊÌÁ-ÓËÒÉÐÔÁ × ÉÓÐÏÌÎÑÅÍÙÅ ËÏÍÁÎÄÙ\n" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" " -i[óõææéëó], --in-place[=óõææéëó]\n" " ÒÅÄÁËÔÉÒÏ×ÁÎÉÅ ÆÁÊÌÏ× ÎÁ ÍÅÓÔÅ (ÓÏÚÄÁÅÔ ËÏÐÉÀ, ÅÓÌÉ ÕËÁÚÁÎÏ " "ÒÁÓÛÉÒÅÎÉÅ)\n" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" " -l N, --line-length=N\n" " ÕËÁÚÁÎÉÅ ÖÅÌÁÅÍÏÊ ÄÌÉÎÙ ÐÅÒÅÎÏÓÉÍÏÊ ÓÔÒÏËÉ ÄÌÑ ËÏÍÁÎÄÙ `l'\n" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" " --posix\n" " ÏÔËÌÀÞÅÎÉÅ ×ÓÅÈ ÒÁÓÛÉÒÅÎÉÊ GNU.\n" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -r, --regexp-extended\n" " ÉÓÐÏÌØÚÏ×ÁÎÉÅ × ÓËÒÉÐÔÅ ÒÁÓÛÉÒÅÎÎÙÈ ÒÅÇÕÌÑÒÎÙÈ ×ÙÒÁÖÅÎÉÊ.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" " -s, --separate\n" " ÄÏÐÕÝÅÎÉÅ, ÞÔÏ ÆÁÊÌÙ ÒÁÚÄÅÌÅÎÙ, Á ÎÅ × ×ÉÄÅ ÏÄÎÏÇÏ\n" " ÄÌÉÎÎÏÇÏ ÎÅÐÒÅÒÙ×ÎÏÇÏ ÐÏÔÏËÁ.\n" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" " -u, --unbuffered\n" " ÚÁÇÒÕÚËÁ ÍÉÎÉÍÁÌØÎÏÇÏ ÏÂßÅÍÁ ÄÁÎÎÙÈ ÉÚ ×ÈÏÄÎÙÈ ÆÁÊÌÏ×\n" " É ÂÏÌÅÅ ÞÁÓÔÙÊ ÓÂÒÏÓ ÎÁ ÄÉÓË ×ÙÈÏÄÎÙÈ ÂÕÆÅÒÏ×\n" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr " --help ×Ù×ÏÄ ÜÔÏÊ ÓÐÒÁ×ËÉ É ×ÙÈÏÄ\n" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr " --version ×Ù×ÏÄ ÉÎÆÏÒÍÁÃÉÉ Ï ×ÅÒÓÉÉ É ×ÙÈÏÄ\n" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" "\n" "åÓÌÉ ÏÐÃÉÑ -e, --expression, -f, ÉÌÉ --file ÎÅ ÕËÁÚÁÎÁ, ÔÏÇÄÁ ÐÅÒ×ÙÊ\n" "ÎÅÏÐÃÉÏÎÁÌØÎÙÊ ÁÒÇÕÍÅÎÔ ÂÅÒÅÔÓÑ ËÁË ÓËÒÉÐÔ sed ÄÌÑ ÉÎÔÅÒÐÒÅÔÁÃÉÉ. ÷ÓÅ\n" "ÏÓÔÁ×ÛÉÅÓÑ ÁÒÇÕÍÅÎÔÙ Ñ×ÌÑÀÔÓÑ ÉÍÅÎÁÍÉ ×ÈÏÄÎÙÈ ÆÁÊÌÏ×; ÅÓÌÉ ×ÈÏÄÎÙÅ\n" "ÆÁÊÌÙ ÎÅ ÕËÁÚÁÎÙ, ÔÏÇÄÁ ÞÉÔÁÅÔÓÑ ÓÔÁÎÔÁÒÔÎÙÊ ××ÏÄ.\n" "\n" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "ïÔÞÅÔÙ Ï ÏÛÉÂËÁÈ ÏÔÐÒÁ×ÌÑÊÔÅ ÐÏ ÁÄÒÅÓÕ: %s .\n" "õÂÅÄÉÔÅÓØ, ÞÔÏ ×ËÌÀÞÉÌÉ ÇÄÅ-ÌÉÂÏ × ÐÏÌÅ ``ôÅÍÁ:'' ÓÌÏ×Ï ``%s''.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed ×ÅÒÓÉÑ %s\n" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "ÏÓÎÏ×ÁÎ ÎÁ GNU sed ×ÅÒÓÉÉ %s\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed ×ÅÒÓÉÑ %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "üÔÏ Ó×ÏÂÏÄÎÏÅ ÐÒÏÇÒÁÍÍÎÏÅ ÏÂÅÓÐÅÞÅÎÉÅ; ÕÓÌÏ×ÉÑ ÅÇÏ ËÏÐÉÒÏ×ÁÎÉÑ ÓÍÏÔÒÉÔÅ ×\n" "ÉÓÈÏÄÎÙÈ ÔÅËÓÔÁÈ. îÅ ÐÒÅÄÏÓÔÁ×ÌÑÅÔÓÑ îéëáëïê ÇÁÒÁÎÔÉÉ; ÄÁÖÅ ÇÁÒÁÎÔÉÉ\n" "ðòéçïäîïóôé äìñ ðòïäáöé ÉÌÉ ðòéíåîéíïóôé äìñ ëïîëòåôîïê ãåìé, × ÔÏÊ ÍÅÒÅ,\n" "× ËÏÔÏÒÏÊ ÜÔÏ ÍÏÖÅÔ ÂÙÔØ ÄÏÐÕÝÅÎÏ ÚÁËÏÎÏÄÁÔÅÌØÓÔ×ÏÍ.\n" #: lib/utils.c:98 lib/utils.c:336 #, c-format msgid "cannot remove %s: %s" msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ %s: %s" #: lib/utils.c:143 #, c-format msgid "couldn't open file %s: %s" msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÆÁÊÌ %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "ÎÅ×ÏÚÍÏÖÎÏ ÚÁÐÉÓÁÔØ %d ÜÌÅÍÅÎÔ × %s: %s" msgstr[1] "ÎÅ×ÏÚÍÏÖÎÏ ÚÁÐÉÓÁÔØ %d ÜÌÅÍÅÎÔÏ× × %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "ÏÛÉÂËÁ ÞÔÅÎÉÑ %s: %s" #: lib/utils.c:341 #, c-format msgid "cannot rename %s: %s" msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÅÒÅÉÍÅÎÏ×ÁÔØ %s: %s" #~ msgid "Success" #~ msgstr "õÓÐÅÛÎÏ" #~ msgid "No match" #~ msgstr "îÅÔ ÓÏÏÔ×ÅÓÔ×ÉÑ" #~ msgid "Invalid regular expression" #~ msgstr "îÅÄÏÐÕÓÔÉÍÏÅ ÒÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ" #~ msgid "Invalid collation character" #~ msgstr "îÅÄÏÐÕÓÔÉÍÙÊ ÓÉÍ×ÏÌ ÓÒÁ×ÎÅÎÉÑ" #~ msgid "Trailing backslash" #~ msgstr "úÁ×ÅÒÛÁÀÝÁÑ ÏÂÒÁÔÎÁÑ ËÏÓÁÑ ÞÅÒÔÁ" #~ msgid "Invalid back reference" #~ msgstr "îÅÄÏÐÕÓÔÉÍÁÑ ÏÂÒÁÔÎÁÑ ÓÓÙÌËÁ" #~ msgid "Unmatched [ or [^" #~ msgstr "îÅÐÁÒÎÙÊ ÓÉÍ×ÏÌ [ ÉÌÉ [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "îÅÐÁÒÎÙÊ ÓÉÍ×ÏÌ ( or \\(" #~ msgid "Unmatched \\{" #~ msgstr "îÅÐÁÒÎÙÊ ÓÉÍ×ÏÌ \\{" #~ msgid "Invalid range end" #~ msgstr "îÅÄÏÐÕÓÔÉÍÏÅ ÏËÏÎÞÁÎÉÅ ÄÉÁÐÁÚÏÎÁ" #~ msgid "Memory exhausted" #~ msgstr "ðÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ" #~ msgid "Invalid preceding regular expression" #~ msgstr "îÅÄÏÐÕÓÔÉÍÏÅ ÐÒÅÄÛÅÓÔ×ÕÀÝÅÅ ÒÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ" #~ msgid "Premature end of regular expression" #~ msgstr "ðÒÅÖÄÅ×ÒÅÍÅÎÎÏÅ ÏËÏÎÞÁÎÉÅ ÒÅÇÕÌÑÒÎÏÇÏ ×ÙÒÁÖÅÎÉÑ" #~ msgid "Unmatched ) or \\)" #~ msgstr "îÅÐÁÒÎÙÊ ÓÉÍ×ÏÌ ) ÉÌÉ \\)" #~ msgid "No previous regular expression" #~ msgstr "îÅÔ ÐÒÅÄÙÄÕÝÅÇÏ ÒÅÇÕÌÑÒÎÏÇÏ ×ÙÒÁÖÅÎÉÑ" sed-3.62/po/sk.gmo0000644000076600007660000000576710176462004010732 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^¡t`ïw!g#‰­ÌÊè ³ Æ" æ  —( ª2 Ó2 : 91 t ¦ Å â     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: GNU sed 4.0.8 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2003-10-25 17:22+0200 Last-Translator: Marcel Telka Language-Team: Slovak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=3; plural= (n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0; -R, --regexp-perl použiÅ¥ syntax regulárnych výrazov z Perlu 5 v skripte. %s Toto je voľné programové vybavenie; podmienky pre kopírovanie a rozÅ¡irovanie nájdete v zdrojových textoch. Toto programové vybavenie je BEZ záruky, a to aj bez záruky PREDAJNOSTI alebo VHODNOSTI PRE NEJAKà KONKRÉTNY ÚČEL. %s: -e výraz #%lu, znak %lu: %s %s: %s nie je možné ÄítaÅ¥: %s %s: súbor %s, riadok %lu: %s : nechce akúkoľvek adresuSprávy o chybách zasielajte na adresu %s (iba anglicky). Prosím vložte slovo ``%s'' niekde do položky ``Predmet:'' Komentáre k slovenskému prekladu zasielajte na adresu . GNU sed verzia %s príkaz `e' nie je podporovaný`}' nevyžaduje akúkoľvek adresunebolo možné zapísaÅ¥ %d položiek do %s: %snebolo možné zapísaÅ¥ %d položku do %s: %snebolo možné zapísaÅ¥ %d položky do %s: %schyba v podproceseoÄakávaná novÅ¡ia verzia programu sedviacnásobné použitie voľby `g' s príkazom `s'viacnásobné použitie voľby `p' s príkazom `s'príkaz `s' môže maÅ¥ maximálne jednu Äíselnú voľbuÄíselná voľba príkazu `s' nemôže byÅ¥ nulavoľba `e' nie je podporovanáchyba pri Äítaní z %s: %ssuper-sed verzia %s sed-3.62/po/sk.po0000644000076600007660000003366210176462003010560 00000000000000# Slovak translations for GNU sed package. # Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc. # Marcel Telka , 2002, 2003. # Miroslav Vasko , 1999. # msgid "" msgstr "" "Project-Id-Version: GNU sed 4.0.8\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2003-10-25 17:22+0200\n" "Last-Translator: Marcel Telka \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=3; plural= (n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Neznáma voľba pre `s'" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "chyba pri Äítaní z %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Neplatný názov triedy znakov" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Nezodpovedajúca `{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Neznáma voľba pre `s'" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Chýbajúci príkaz" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Regulárny výraz je príliÅ¡ veľký" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "voľba `e' nie je podporovaná" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Neplatný obsah \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Viacnásobný `!'" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "NeoÄakávaná `,'" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "+N alebo ~N sa nedá použiÅ¥ ako prvá adresa" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Nezodpovedajúca `{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "NeoÄakávaná `}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "NadbytoÄné znaky po príkaze" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "OÄakávané \\ po `a', `c' alebo `i'" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "`}' nevyžaduje akúkoľvek adresu" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": nechce akúkoľvek adresu" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "V komentári nie je prípustná akákoľvek adresa" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Chýbajúci príkaz" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Príkaz používa iba jednu adresu" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "NeukonÄený regulárny výraz adresy" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "NeukonÄený príkaz `s'" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "NeukonÄený príkaz `y'" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Neznáma voľba pre `s'" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "viacnásobné použitie voľby `p' s príkazom `s'" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "viacnásobné použitie voľby `g' s príkazom `s'" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "príkaz `s' môže maÅ¥ maximálne jednu Äíselnú voľbu" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "Äíselná voľba príkazu `s' nemôže byÅ¥ nula" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "reÅ¥azce pre príkaz `y' majú rôzne dĺžky" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "oÄakávaná novÅ¡ia verzia programu sed" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Príkaz používa iba jednu adresu" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Neznámy príkaz:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: súbor %s, riadok %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e výraz #%lu, znak %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Návestie pre skok na `%s' nie je možné nájsÅ¥?" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: %s nie je možné ÄítaÅ¥: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Nebolo možné otvoriÅ¥ súbor %s: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Nebolo možné otvoriÅ¥ doÄasný súbor %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "chyba v podprocese" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "voľba `e' nie je podporovaná" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "príkaz `e' nie je podporovaný" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Bez predchádzajúceho regulárneho výrazu" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Nie je možné zadaÅ¥ modifikátory pre prázdny regulárny výraz" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Neplatný odkaz \\%d na `s' príkazu RHS" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " použiÅ¥ syntax regulárnych výrazov z Perlu 5 v skripte.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " použiÅ¥ syntax regulárnych výrazov z Perlu 5 v skripte.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Správy o chybách zasielajte na adresu %s (iba anglicky).\n" "Prosím vložte slovo ``%s'' niekde do položky ``Predmet:''\n" "Komentáre k slovenskému prekladu zasielajte na adresu .\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed verzia %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "založené na GNU sed verzia 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed verzia %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Toto je voľné programové vybavenie; podmienky pre kopírovanie a " "rozÅ¡irovanie\n" "nájdete v zdrojových textoch. Toto programové vybavenie je BEZ záruky,\n" "a to aj bez záruky PREDAJNOSTI alebo VHODNOSTI PRE NEJAKà KONKRÉTNY ÚČEL.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: %s nie je možné ÄítaÅ¥: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Nebolo možné otvoriÅ¥ súbor %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "nebolo možné zapísaÅ¥ %d položiek do %s: %s" msgstr[1] "nebolo možné zapísaÅ¥ %d položku do %s: %s" msgstr[2] "nebolo možné zapísaÅ¥ %d položky do %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "chyba pri Äítaní z %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: %s nie je možné ÄítaÅ¥: %s\n" #~ msgid "Success" #~ msgstr "Úspech" #~ msgid "No match" #~ msgstr "Nezodpovedá" #~ msgid "Invalid regular expression" #~ msgstr "Neplatný regulárny výraz" #~ msgid "Invalid collation character" #~ msgstr "Neplatný znak pre porovnávanie" #~ msgid "Trailing backslash" #~ msgstr "UkonÄovacie opaÄné lomítko" #~ msgid "Invalid back reference" #~ msgstr "Neplatný spätný odkaz" #~ msgid "Unmatched [ or [^" #~ msgstr "Nezodpovedajúca [ alebo [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "Nezodpovedajúca ( alebo \\(" #~ msgid "Unmatched \\{" #~ msgstr "Nezodpovedajúca \\{" #~ msgid "Invalid range end" #~ msgstr "Neplatný koniec rozsahu" #~ msgid "Memory exhausted" #~ msgstr "VyÄerpaná pamäť" #~ msgid "Invalid preceding regular expression" #~ msgstr "Neplatný predchádzajúci regulárny výraz" #~ msgid "Premature end of regular expression" #~ msgstr "NeoÄakávaný koniec regulárneho výrazu" #~ msgid "Unmatched ) or \\)" #~ msgstr "Nezodpovedajúca ) alebo \\)" #~ msgid "No previous regular expression" #~ msgstr "Bez predchádzajúceho regulárneho výrazu" sed-3.62/po/sl.gmo0000644000076600007660000000561010176462005010717 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^èt^]Ú¼ —¸ Ö÷g  t ‹ ž¦ ¼ c' w! Ÿ! Á' ã2  > T o     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.6 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2003-04-02 17:20+0200 Last-Translator: Primo¾ Peterlin Language-Team: Slovenian MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-2 Content-Transfer-Encoding: 8-bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0); -R, --regexp-perl dovoli uporabo regularnih izrazov, ki jih podpira Perl 5 %s To je prost program; pogoji, pod katerimi ga lahko uporabljate, razmno¾ujete in raz¹irjate so navedeni v izvorni kodi. Za program ni NOBENEGA JAMSTVA, niti jamstev USTREZNOSTI ZA PRODAJO ali PRIMERNOSTI ZA UPORABO. %s: -e izraz #%lu, znak %lu: %s %s: %s ni mo¾no prebrati: %s %s: datoteka %s vrstica %lu: %s : ne zahteva naslovaSporoèila o napakah po¹ljite na %s . Poskrbite, da bo nekje v polju ,,Subject`` nastopal izraz ,,%s``. GNU sed, razlièica %s Ukaz ,e` ni podprtZaklepaj } ne zahteva naslovani mogoèe zapisati %d elementov na %s: %sni mogoèe zapisati %d elementa na %s: %sni mogoèe zapisati %d elementov na %s: %sni mogoèe zapisati %d elementov na %s: %sNapaka v podprocesuprièakovana novej¹a izdaja programa sedveèterne izbire "g" pri ukazu "s"veèterne izbire "p" pri ukazu "s"veèterne ¹tevilène izbire pri ukazu "s"¹tevilèna izbira pri ukazu "s" mora biti nenièelnaIzbira ,e` ni podprtanapaka pri branju z %s: %ssuper-sed, razlièica %s sed-3.62/po/sl.po0000644000076600007660000003354210176462003010556 00000000000000# -*- mode:po; coding:iso-latin-2;-*- Slovenian message catalogue for GNU sed. # Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. # Primo¾ Peterlin , 2000, 2001, 2002, 2003. # $Id: sed-4.0.6.sl.po,v 1.2 2003/04/02 15:20:33 peterlin Exp $ # msgid "" msgstr "" "Project-Id-Version: sed 4.0.6\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2003-04-02 17:20+0200\n" "Last-Translator: Primo¾ Peterlin \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8-bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Neznane izbire pri ukazu \"s\"" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "napaka pri branju z %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Neveljavno ime razreda znakov" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "Oklepaj { brez zaklepaja" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Neznane izbire pri ukazu \"s\"" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Ukaz manjka" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Regularni izraz prevelik" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "Izbira ,e` ni podprta" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Neveljavna vsebina \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Veèterni klicaji \"!\"" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Neprièakovana vejica \",\"" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Obliki +N in ~N nista dovoljeni kot zaèetna naslova" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "Oklepaj { brez zaklepaja" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Neprièakovan zaklepaj }" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Ukazu sledijo dodatni znaki" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Za ,a`, ,c` ali ,i` se prièakuje \\" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "Zaklepaj } ne zahteva naslova" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": ne zahteva naslova" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Komentarji ne sprejemajo naslovov" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Ukaz manjka" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Ukaz uporablja le en naslov" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Regularni izraz z nezakljuèenim naslovom" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Nezakljuèen ukaz \"s\"" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Nezakljuèen ukaz \"y\"" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Neznane izbire pri ukazu \"s\"" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "veèterne izbire \"p\" pri ukazu \"s\"" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "veèterne izbire \"g\" pri ukazu \"s\"" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "veèterne ¹tevilène izbire pri ukazu \"s\"" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "¹tevilèna izbira pri ukazu \"s\" mora biti nenièelna" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "niza pri ukazu \"y\" sta razlièno dolga" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "prièakovana novej¹a izdaja programa sed" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Nepravilna uporaba modifikatorja naslova" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Neznan ukaz:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: datoteka %s vrstica %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e izraz #%lu, znak %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Oznake za skok na \"%s\" ni mo¾no najti" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: %s ni mo¾no prebrati: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Datoteke %s ni mogoèe odpreti: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Datoteke %s ni mogoèe odpreti: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "Napaka v podprocesu" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "Izbira ,e` ni podprta" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "Ukaz ,e` ni podprt" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Prej¹nji regularni izraz manjka" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Doloèanje modifikatorjev pri praznem regularnem izrazu ni mogoèe" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "Neveljavni sklic \\%d na desni strani ukaza ,s`" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " dovoli uporabo regularnih izrazov, ki jih podpira Perl 5\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " dovoli uporabo regularnih izrazov, ki jih podpira Perl 5\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Sporoèila o napakah po¹ljite na %s .\n" "Poskrbite, da bo nekje v polju ,,Subject`` nastopal izraz ,,%s``.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed, razlièica %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "na osnovi GNU sed, razlièica 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed, razlièica %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "To je prost program; pogoji, pod katerimi ga lahko uporabljate, " "razmno¾ujete\n" "in raz¹irjate so navedeni v izvorni kodi. Za program ni NOBENEGA JAMSTVA,\n" "niti jamstev USTREZNOSTI ZA PRODAJO ali PRIMERNOSTI ZA UPORABO.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: %s ni mo¾no prebrati: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Datoteke %s ni mogoèe odpreti: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "ni mogoèe zapisati %d elementov na %s: %s" msgstr[1] "ni mogoèe zapisati %d elementa na %s: %s" msgstr[2] "ni mogoèe zapisati %d elementov na %s: %s" msgstr[3] "ni mogoèe zapisati %d elementov na %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "napaka pri branju z %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: %s ni mo¾no prebrati: %s\n" #~ msgid "Success" #~ msgstr "Uspe¹no" #~ msgid "No match" #~ msgstr "Ni ujemanja" #~ msgid "Invalid regular expression" #~ msgstr "Neveljavni regularni izraz" #~ msgid "Invalid collation character" #~ msgstr "Znaka izven abecede" #~ msgid "Trailing backslash" #~ msgstr "Zakljuèna obrnjena po¹evnica" #~ msgid "Invalid back reference" #~ msgstr "Neveljavni povratni sklic" #~ msgid "Unmatched [ or [^" #~ msgstr "Oklepaj [ ali [^ brez zaklepaja" #~ msgid "Unmatched ( or \\(" #~ msgstr "Oklepaj ( ali \\( brez zaklepaja" #~ msgid "Unmatched \\{" #~ msgstr "Oklepaj \\{ brez zaklepaja" #~ msgid "Invalid range end" #~ msgstr "Neveljavna zgornja meja intervala" #~ msgid "Memory exhausted" #~ msgstr "Zmanjkalo pomnilnika" #~ msgid "Invalid preceding regular expression" #~ msgstr "Neveljaven prej¹nji regularni izraz" #~ msgid "Premature end of regular expression" #~ msgstr "Predèasni zakljuèek regularnega izraza" #~ msgid "Unmatched ) or \\)" #~ msgstr "Oklepaj ) ali \\) brez zaklepaja" #~ msgid "No previous regular expression" #~ msgstr "Prej¹nji regularni izraz manjka" sed-3.62/po/sr.gmo0000644000076600007660000000645610176462005010736 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^Ñt†FÍ)Ò'ü' $/ L | 0 85 i­ Ÿ$ M5 r9 ¨9 âD T a. ¶+ å      -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.9 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-01-13 22:51-0500 Last-Translator: Aleksandar Jelenak Language-Team: Serbian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : (n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); -R, --regexp-perl кориÑти у ÑпиÑу ÑинтакÑу Перла 5 за регуларне изразе. %s Ово је Ñлободан Ñофтвер; видети изворни кôд за уÑлове умножавања. БЕЗ икакве гаранције; чак ни о ТРЖИШÐОСТИ или ИСПУЊÐÐ’ÐЊУ ОДРЕЂЕÐЕ ПОТРЕБЕ. %s: -e израз #%lu, знак %lu: %s %s: не може читати %s: %s %s: датотека %s ред %lu: %s : не захтева икакве адреÑеЕпошта за пријаву грешака: %s . ПоÑтарајте Ñе да укључите реч „%s“ негде у „Subject:“ пољу. ГÐУ sed верзија %s наредба „e“ није подржана„}“ не захтева икакве адреÑенеуÑпешан Ð·Ð°Ð¿Ð¸Ñ %d Ñтавке на %s: %sнеуÑпешан Ð·Ð°Ð¿Ð¸Ñ %d Ñтавке на %s: %sнеуÑпешан Ð·Ð°Ð¿Ð¸Ñ %d Ñтавки на %s: %sгрешка у потпроцеÑуочекивана новија верзија sed-авише „g“ опција за „s“ наредбувише „p“ опција за „s“ наредбувише бројчаних опција за „s“ наредбубројчана опција наредбе „s“ не може бити нулаопција „e“ није подржанагрешка учитавања на %s: %ssuper-sed верзија %s sed-3.62/po/sr.po0000644000076600007660000003623410176462003010565 00000000000000# Serbian translation of `sed'. # Copyright (C) 2003 Free Software Foundation, Inc. # This file is distributed under the same license as the `sed' package. # Aleksandar Jelenak , 2003. msgid "" msgstr "" "Project-Id-Version: sed 4.0.9\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-01-13 22:51-0500\n" "Last-Translator: Aleksandar Jelenak \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : (n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "Ðепозната опција за „s“" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "грешка учитавања на %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "ÐеиÑправно име клаÑе знакова" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "ÐеÑпарена „{“" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "Ðепозната опција за „s“" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "ÐедоÑтаје наредба" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Регуларни израз Ñувише велик" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "опција „e“ није подржана" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "ÐеиÑправни Ñадржај у \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Више „!“" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Ðеочекиван „,“" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "Ðе може Ñе кориÑтити +N или ~N као прва адреÑа" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "ÐеÑпарена „{“" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Ðеочекивана „}“" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Вишак знакова поÑле наредбе" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "Очекивано \\ поÑле „a“, „c“ или „i“" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "„}“ не захтева икакве адреÑе" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": не захтева икакве адреÑе" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Коментари не прихватају икакве адреÑе" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "ÐедоÑтаје наредба" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Ðаредба кориÑти Ñамо једну адреÑу" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Ðезавршена адреÑа рег. израза" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Ðезавршена наредба „s“" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Ðезавршена наредба „y“" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "Ðепозната опција за „s“" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "више „p“ опција за „s“ наредбу" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "више „g“ опција за „s“ наредбу" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "више бројчаних опција за „s“ наредбу" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "бројчана опција наредбе „s“ не може бити нула" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "ниÑке за команду „y“ Ñу различите дужине" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "очекивана новија верзија sed-а" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Ðаредба кориÑти Ñамо једну адреÑу" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Ðепозната наредба:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: датотека %s ред %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e израз #%lu, знак %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "Ðе могу да нађем ознаку за Ñкок на „%s“" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: не може читати %s: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "Ðе може Ñе отворити датотека %s: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Ðе могу отворити привремену датотеку %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "грешка у потпроцеÑу" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "опција „e“ није подржана" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "наредба „e“ није подржана" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Без претходног регуларног израза" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "Ðе може Ñе навеÑти измењивач празном рег. изразу" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "ÐеиÑправна референца \\%d на деÑној Ñтрани наредбе „s“" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " кориÑти у ÑпиÑу ÑинтакÑу Перла 5 за регуларне изразе.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " кориÑти у ÑпиÑу ÑинтакÑу Перла 5 за регуларне изразе.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Епошта за пријаву грешака: %s .\n" "ПоÑтарајте Ñе да укључите реч „%s“ негде у „Subject:“ пољу.\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed верзија %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "заÑновано на ГÐУ sed верзија 3.02.80\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "ГÐУ sed верзија %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Ово је Ñлободан Ñофтвер; видети изворни кôд за уÑлове умножавања. БЕЗ " "икакве\n" "гаранције; чак ни о ТРЖИШÐОСТИ или ИСПУЊÐÐ’ÐЊУ ОДРЕЂЕÐЕ ПОТРЕБЕ.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: не може читати %s: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "Ðе може Ñе отворити датотека %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "неуÑпешан Ð·Ð°Ð¿Ð¸Ñ %d Ñтавке на %s: %s" msgstr[1] "неуÑпешан Ð·Ð°Ð¿Ð¸Ñ %d Ñтавке на %s: %s" msgstr[2] "неуÑпешан Ð·Ð°Ð¿Ð¸Ñ %d Ñтавки на %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "грешка учитавања на %s: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: не може читати %s: %s\n" #~ msgid "Success" #~ msgstr "УÑпех" #~ msgid "No match" #~ msgstr "Без поклапања" #~ msgid "Invalid regular expression" #~ msgstr "ÐеиÑправни регуларни израз" #~ msgid "Invalid collation character" #~ msgstr "ÐеиÑправни знак прикупљања" #~ msgid "Trailing backslash" #~ msgstr "Пратећа обрнута коÑа црта" #~ msgid "Invalid back reference" #~ msgstr "ÐеиÑправна повратна референца" #~ msgid "Unmatched [ or [^" #~ msgstr "ÐеÑпарено [ или ^[" #~ msgid "Unmatched ( or \\(" #~ msgstr "ÐеÑпарено ( или \\(" #~ msgid "Unmatched \\{" #~ msgstr "ÐеÑпарено \\{" #~ msgid "Invalid range end" #~ msgstr "ÐеиÑправни крај опÑега" #~ msgid "Memory exhausted" #~ msgstr "Меморија иÑцрпљена" #~ msgid "Invalid preceding regular expression" #~ msgstr "ÐеиÑправан претходећи регуларни израз" #~ msgid "Premature end of regular expression" #~ msgstr "Преран крај регуларног израза" #~ msgid "Unmatched ) or \\)" #~ msgstr "ÐеÑпарено ) или \\)" #~ msgid "No previous regular expression" #~ msgstr "Без претходног регуларног израза" sed-3.62/po/ssed.pot0000644000076600007660000002377310144702762011273 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, c-format msgid "pcregrep: unknown option %c\n" msgstr "" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 msgid "invalid escape sequence in character class" msgstr "" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 msgid "unmatched braces" msgstr "" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 msgid "unknown option bit(s) set" msgstr "" #: pcre/regexp.c:65 msgid "missing ) after comment" msgstr "" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 msgid "regular expression too large" msgstr "" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 msgid "POSIX collating elements are not supported" msgstr "" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 msgid "invalid repeat counts in {}" msgstr "" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 msgid "multiple `!'s" msgstr "" #: sed/compile.c:163 msgid "unexpected `,'" msgstr "" #: sed/compile.c:164 msgid "invalid usage of +N or ~N as first address" msgstr "" #: sed/compile.c:165 msgid "unmatched `{'" msgstr "" #: sed/compile.c:166 msgid "unexpected `}'" msgstr "" #: sed/compile.c:167 msgid "extra characters after command" msgstr "" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr "" #: sed/compile.c:171 msgid "comments don't accept any addresses" msgstr "" #: sed/compile.c:172 msgid "missing command" msgstr "" #: sed/compile.c:173 msgid "command only uses one address" msgstr "" #: sed/compile.c:174 msgid "unterminated address regex" msgstr "" #: sed/compile.c:175 msgid "unterminated `s' command" msgstr "" #: sed/compile.c:176 msgid "unterminated `y' command" msgstr "" #: sed/compile.c:177 msgid "unknown option to `s'" msgstr "" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "" #: sed/compile.c:182 msgid "strings for `y' command are different lengths" msgstr "" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "" #: sed/compile.c:185 msgid "invalid usage of line address 0" msgstr "" #: sed/compile.c:186 #, c-format msgid "unknown command: `%c'" msgstr "" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "" #: sed/compile.c:1644 #, c-format msgid "can't find label for jump to `%s'" msgstr "" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "" #: sed/execute.c:672 #, c-format msgid "couldn't edit %s: is a terminal" msgstr "" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: sed/execute.c:683 lib/utils.c:196 #, c-format msgid "couldn't open temporary file %s: %s" msgstr "" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" #: lib/utils.c:98 lib/utils.c:336 #, c-format msgid "cannot remove %s: %s" msgstr "" #: lib/utils.c:143 #, c-format msgid "couldn't open file %s: %s" msgstr "" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "" msgstr[1] "" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "" #: lib/utils.c:341 #, c-format msgid "cannot rename %s: %s" msgstr "" sed-3.62/po/sv.gmo0000644000076600007660000002026210176462005010731 00000000000000•Þ?Y púq,l5™7Ï\`duÅl;b¨V Y b~ ¼ ;º Ë% † ¬ à Ýd ú _H s ¼ Ö õ!  5 J( _ ˆ# ¦ Ê$ ê#)BM2à ×ø*5*`‹« »#É#í&8,W„-²àö* @Ng€€›ð2 6@;w^³e†xÿYZêVE€œ†x¤$B\t†’I-w°+Ðü31#e$‰&®*Õ'OF)–À&Ó ú083i"À Ð$Ú$ÿ&$ K2lŸ¶+Èô  " 7 M ] t& ‹20>3 ?, 91+$4:")7/.* 5#= -%< 6;&8('! If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. --help display this help and exit --version output version information and exit --posix disable all GNU extensions. -R, --regexp-perl use Perl 5's regular expressions syntax in the script. -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) -l N, --line-length=N specify the desired line-wrap length for the `l' command -n, --quiet, --silent suppress automatic printing of pattern space -r, --regexp-extended use extended regular expressions in the script. -s, --separate consider files as separate rather than as a single continuous long stream. -u, --unbuffered load minimal amounts of data from the input files and flush the output buffers more often %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]... `e' command not supported`}' doesn't want any addressesbased on GNU sed version %s can't find label for jump to `%s'cannot remove %s: %scannot rename %s: %scannot specify modifiers on empty regexpcommand only uses one addresscomments don't accept any addressescouldn't edit %s: is a terminalcouldn't edit %s: not a regular filecouldn't open file %s: %scouldn't open temporary file %s: %scouldn't write %d item to %s: %scouldn't write %d items to %s: %sdelimiter character is not a single-byte charactererror in subprocessexpected \ after `a', `c' or `i'expected newer version of sedextra characters after commandinvalid reference \%d on `s' command's RHSinvalid usage of +N or ~N as first addressinvalid usage of line address 0missing commandmultiple `!'smultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandno previous regular expressionnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %sstrings for `y' command are different lengthssuper-sed version %s unexpected `,'unexpected `}'unknown command: `%c'unknown option to `s'unmatched `{'unterminated `s' commandunterminated `y' commandunterminated address regexProject-Id-Version: sed 4.1.1 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-07-11 11:45+0200 Last-Translator: Christian Rose Language-Team: Swedish MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: Plural-Forms: nplurals=2; plural=(n != 1); Om ingen av flaggorna -e, --expression, -f, eller --file ges, blir det första argumentet som inte är en flagga det sed-skript som tolkas. Alla återstående argument är namn på indatafiler. Om inga indatafiler är angivna läses standard in. --help visa denna hjälptext och avsluta --version visa versionsinformation och avsluta --posix inaktivera alla GNU-utökningar. -R, --regexp-perl använd Perl 5:s syntax för reguljära uttryck i skriptet. -e skript, --expression=skript lägg till skript till de kommandon som ska utföras -f skriptfil, --file=skriptfil lägg till innehållet i skriptfil till de kommandon som ska utföras -i[ÄNDELSE], --in-place[=ÄNDELSE] redigera filer på plats (skapar säkerhetskopia om ändelse tillhandahålls) -l N, --line-length=N ange önskad radbrytningslängd för "l"-kommandot -n, --quiet, --silent förhindrar automatisk utskrift av mönsterutrymme -r, --regexp-extended använd utökade reguljära uttryck i skriptet. -s, --separate betrakta filer som separata istället för som en kontinuerlig lång dataström. -u, --unbuffered läs in minimala mängder data från indatafilerna och töm utdatabufferterna oftare %s (Följande text är en informell översättning som enbart tillhandahålls i informativt syfte. För alla juridiska tolkningar gäller den engelska originaltexten.) Det här är fri programvara; se källkoden angående villkor för kopiering. Det finns INGEN garanti; inte ens för SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT SPECIELLT ÄNDAMÅL, i den omfattning som medges av gällande lag. %s: -e uttryck #%lu, tecken %lu: %s %s: kan inte läsa %s: %s %s: fil %s rad %lu: %s : vill inte ha några adresserRapportera fel till: %s . Ange ordet "%s" på något ställe i "Ärende:"-fältet. Skicka anmärkningar på översättningen till . GNU sed version %s Användning: %s [FLAGGA]... {skript-endast-om-inga-andra} [indatafil]... kommandot "e" stöds inte"}" vill inte ha några adresserbaserad på GNU sed version %s kan inte hitta etiketten för hopp till "%s"kan inte ta bort %s: %skan inte byta namn på %s: %skan inte ange modifierare på tomt reguljärt uttryckkommandot använder endast en adresskommentarer accepterar inga adresserkunde inte redigera %s: är en terminalkunde inte redigera %s: inte en vanlig filkunde inte öppna filen %s: %skunde inte öppna temporära filen %s: %skunde inte skriva %d objekt till %s: %skunde inte skriva %d objekt till %s: %savgränsningstecknet är inte en ensam bytefel i underprocess\ förväntades efter "a", "c" eller "i"nyare version av sed förväntadesextra tecken efter kommandotogiltig referens \%d på "s"-kommandots högersidaogiltig användning av +N eller ~N som första adressfelaktig användning av radadress 0kommando saknasflera "!"flera "g"-flaggor till "s"-kommandotflera "p"-flaggor till "s"-kommandotflera sifferflaggor till "s"-kommandotinget tidigare reguljärt uttrycksifferflagga till kommandot "s" får inte vara nollflaggan "e" stöds inteläsfel vid %s: %ssträngarna för kommandot "y" är olika långasuper-sed version %s oväntat ","oväntad "}"okänt kommando: "%c"flaggan okänd för "s"obalanserad "{"oavslutat "s"-kommandooavslutat "y"-kommandooavslutat reguljärt uttryck för adresssed-3.62/po/sv.po0000644000076600007660000003574610176462003010600 00000000000000# Swedish messages for sed. # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. # Christian Rose , 1999, 2000, 2001, 2002, 2003, 2004. # msgid "" msgstr "" "Project-Id-Version: sed 4.1.1\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-07-11 11:45+0200\n" "Last-Translator: Christian Rose \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "flaggan okänd för \"s\"" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "läsfel vid %s: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Ogiltigt teckenklassnamn" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "obalanserad \"{\"" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "flaggan okänd för \"s\"" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "kommando saknas" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Reguljärt uttryck för stort" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr "flaggan \"e\" stöds inte" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "Ogiltigt innehåll i \\{\\}" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 msgid "multiple `!'s" msgstr "flera \"!\"" #: sed/compile.c:163 msgid "unexpected `,'" msgstr "oväntat \",\"" #: sed/compile.c:164 msgid "invalid usage of +N or ~N as first address" msgstr "ogiltig användning av +N eller ~N som första adress" #: sed/compile.c:165 msgid "unmatched `{'" msgstr "obalanserad \"{\"" #: sed/compile.c:166 msgid "unexpected `}'" msgstr "oväntad \"}\"" #: sed/compile.c:167 msgid "extra characters after command" msgstr "extra tecken efter kommandot" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "\\ förväntades efter \"a\", \"c\" eller \"i\"" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "\"}\" vill inte ha några adresser" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": vill inte ha några adresser" #: sed/compile.c:171 msgid "comments don't accept any addresses" msgstr "kommentarer accepterar inga adresser" #: sed/compile.c:172 msgid "missing command" msgstr "kommando saknas" #: sed/compile.c:173 msgid "command only uses one address" msgstr "kommandot använder endast en adress" #: sed/compile.c:174 msgid "unterminated address regex" msgstr "oavslutat reguljärt uttryck för adress" #: sed/compile.c:175 msgid "unterminated `s' command" msgstr "oavslutat \"s\"-kommando" #: sed/compile.c:176 msgid "unterminated `y' command" msgstr "oavslutat \"y\"-kommando" #: sed/compile.c:177 msgid "unknown option to `s'" msgstr "flaggan okänd för \"s\"" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "flera \"p\"-flaggor till \"s\"-kommandot" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "flera \"g\"-flaggor till \"s\"-kommandot" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "flera sifferflaggor till \"s\"-kommandot" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "sifferflagga till kommandot \"s\" får inte vara noll" #: sed/compile.c:182 msgid "strings for `y' command are different lengths" msgstr "strängarna för kommandot \"y\" är olika långa" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "avgränsningstecknet är inte en ensam byte" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "nyare version av sed förväntades" #: sed/compile.c:185 msgid "invalid usage of line address 0" msgstr "felaktig användning av radadress 0" #: sed/compile.c:186 #, c-format msgid "unknown command: `%c'" msgstr "okänt kommando: \"%c\"" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: fil %s rad %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e uttryck #%lu, tecken %lu: %s\n" #: sed/compile.c:1644 #, c-format msgid "can't find label for jump to `%s'" msgstr "kan inte hitta etiketten för hopp till \"%s\"" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: kan inte läsa %s: %s\n" #: sed/execute.c:672 #, c-format msgid "couldn't edit %s: is a terminal" msgstr "kunde inte redigera %s: är en terminal" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "kunde inte redigera %s: inte en vanlig fil" #: lib/utils.c:196 sed/execute.c:683 #, c-format msgid "couldn't open temporary file %s: %s" msgstr "kunde inte öppna temporära filen %s: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "fel i underprocess" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "flaggan \"e\" stöds inte" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "kommandot \"e\" stöds inte" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "inget tidigare reguljärt uttryck" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "kan inte ange modifierare på tomt reguljärt uttryck" # Kommentar från Jan Djärv: # Jag antar RHS står för "right hand side". Man kan då säga # "... kommandots högersida" # #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "ogiltig referens \\%d på \"s\"-kommandots högersida" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " använd Perl 5:s syntax för reguljära uttryck i skriptet.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" "Användning: %s [FLAGGA]... {skript-endast-om-inga-andra} [indatafil]...\n" "\n" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" " -n, --quiet, --silent\n" " förhindrar automatisk utskrift av mönsterutrymme\n" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" " -e skript, --expression=skript\n" " lägg till skript till de kommandon som ska utföras\n" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" " -f skriptfil, --file=skriptfil\n" " lägg till innehållet i skriptfil till de kommandon som ska\n" " utföras\n" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" " -i[ÄNDELSE], --in-place[=ÄNDELSE]\n" " redigera filer på plats (skapar säkerhetskopia om ändelse\n" " tillhandahålls)\n" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" " -l N, --line-length=N\n" " ange önskad radbrytningslängd för \"l\"-kommandot\n" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" " --posix\n" " inaktivera alla GNU-utökningar.\n" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -r, --regexp-extended\n" " använd utökade reguljära uttryck i skriptet.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" " -s, --separate\n" " betrakta filer som separata istället för som en\n" " kontinuerlig lång dataström.\n" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" " -u, --unbuffered\n" " läs in minimala mängder data från indatafilerna och töm\n" " utdatabufferterna oftare\n" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr " --help visa denna hjälptext och avsluta\n" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr " --version visa versionsinformation och avsluta\n" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" "\n" "Om ingen av flaggorna -e, --expression, -f, eller --file ges, blir det\n" "första argumentet som inte är en flagga det sed-skript som tolkas. Alla\n" "återstående argument är namn på indatafiler. Om inga indatafiler är angivna\n" "läses standard in.\n" "\n" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Rapportera fel till: %s .\n" "Ange ordet \"%s\" på något ställe i \"Ärende:\"-fältet.\n" "Skicka anmärkningar på översättningen till .\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed version %s\n" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "baserad på GNU sed version %s\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed version %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "(Följande text är en informell översättning som enbart tillhandahålls\n" " i informativt syfte. För alla juridiska tolkningar gäller den engelska\n" " originaltexten.)\n" "Det här är fri programvara; se källkoden angående villkor för kopiering.\n" "Det finns INGEN garanti; inte ens för SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT\n" "SPECIELLT ÄNDAMÅL, i den omfattning som medges av gällande lag.\n" #: lib/utils.c:98 lib/utils.c:336 #, c-format msgid "cannot remove %s: %s" msgstr "kan inte ta bort %s: %s" #: lib/utils.c:143 #, c-format msgid "couldn't open file %s: %s" msgstr "kunde inte öppna filen %s: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "kunde inte skriva %d objekt till %s: %s" msgstr[1] "kunde inte skriva %d objekt till %s: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "läsfel vid %s: %s" #: lib/utils.c:341 #, c-format msgid "cannot rename %s: %s" msgstr "kan inte byta namn på %s: %s" #~ msgid "Success" #~ msgstr "Lyckades" #~ msgid "No match" #~ msgstr "Ingen träff" #~ msgid "Invalid regular expression" #~ msgstr "Ogiltigt reguljärt uttryck" #~ msgid "Invalid collation character" #~ msgstr "Ogiltigt sorteringstecken" #~ msgid "Trailing backslash" #~ msgstr "Eftersläpande omvänt snedstreck" #~ msgid "Invalid back reference" #~ msgstr "Ogiltig bakåtreferens" #~ msgid "Unmatched [ or [^" #~ msgstr "Obalanserad [ eller [^" #~ msgid "Unmatched ( or \\(" #~ msgstr "Obalanserad ( eller \\(" #~ msgid "Unmatched \\{" #~ msgstr "Obalanserad \\{" #~ msgid "Invalid range end" #~ msgstr "Ogiltigt intervallslut" #~ msgid "Memory exhausted" #~ msgstr "Minnet slut" #~ msgid "Invalid preceding regular expression" #~ msgstr "Ogiltigt föregående reguljärt uttryck" #~ msgid "Premature end of regular expression" #~ msgstr "För tidigt slut på reguljärt uttryck" #~ msgid "Unmatched ) or \\)" #~ msgstr "Obalanserad ) eller \\)" #~ msgid "No previous regular expression" #~ msgstr "Inget tidigare reguljärt uttryck" sed-3.62/po/tr.gmo0000644000076600007660000000553510176462005010734 00000000000000•ÞÄlà\áº>%ù6PdmÒæBbv#”#¸&Ü,0I^¦t^Éz De}š¹¶ p †  M ¹ ' 2 A2 t4 §4 Ü  / G     -R, --regexp-perl use Perl 5's regular expressions syntax in the script. %s This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. GNU sed version %s `e' command not supported`}' doesn't want any addressescouldn't write %d item to %s: %scouldn't write %d items to %s: %serror in subprocessexpected newer version of sedmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zerooption `e' not supportedread error on %s: %ssuper-sed version %s Project-Id-Version: sed 4.0.9 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2004-05-19 18:06+0300 Last-Translator: Deniz Akkus Kanca Language-Team: Turkish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: X-Generator: KBabel 1.0.2 Plural-Forms: nplurals=1; plural=0; -R, --regexp-perl betikte Perl 5'in düzenli ifade sözdizimini kullanır. %s Bu serbest yazılımdır; kopyalama koÅŸulları için kaynak koduna bakınız. Hiçbir garantisi yoktur; hatta SATILABİLİRLİĞİ veya HERHANGİ BİR AMACA UYGUNLUÄžU için bile garanti verilmez. %s: -e ifade #%lu, harf %lu: %s %s: %s okunamıyor: %s %s: dosya %s satır %lu: %s : için hiç adres istenmezYazılım hatalarını %s adresine, çeviri hatalarını adresine bildirin. ``%s'' sözcüğünün Konu baÅŸlığında yer almasına dikkat edin. GNU sed sürümü %s `e' komutu desteklenmiyor'}' için adres istenmez%d sayıda öğe %s'e yazılamadı: %s%d sayıda öğe %s'e yazılamadı: %saltsüreçte hatased'in daha yeni bir sürümü beklendi`s' komutuna birden fazla `g' seçeneÄŸi verilmiÅŸ`s' komutuna birden fazla `p' seçeneÄŸi verilmiÅŸ`s' komutuna birden fazla sayı seçeneÄŸi verilmiÅŸ`s' komutuna verilen sayı seçeneÄŸi sıfır olamaz e' seçeneÄŸi desteklenmiyor%s'de okuma hatası: %ssuper-sed sürüm %s sed-3.62/po/tr.po0000644000076600007660000003320510176462003010561 00000000000000# translation of sed-4.0.9.tr.po to Turkish # Copyright (C) 2003 Free Software Foundation, Inc. # Deniz Akkus Kanca , 2001,2003, 2004. # msgid "" msgstr "" "Project-Id-Version: sed 4.0.9\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2004-05-19 18:06+0300\n" "Last-Translator: Deniz Akkus Kanca \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" "X-Generator: KBabel 1.0.2\n" "Plural-Forms: nplurals=1; plural=0;\n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "`s' komutuna bilinmeyen seçenek verilmiÅŸ" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "%s'de okuma hatası: %s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 #, fuzzy msgid "invalid escape sequence in character class" msgstr "Hatalı karakter sınıf ismi" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "EÅŸleÅŸmeyen '{'" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "`s' komutuna bilinmeyen seçenek verilmiÅŸ" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "Komut eksik" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" # #: pcre/regexp.c:67 pcre/regexp.c:137 #, fuzzy msgid "regular expression too large" msgstr "Düzenli ifade fazla büyük" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 #, fuzzy msgid "POSIX collating elements are not supported" msgstr " e' seçeneÄŸi desteklenmiyor" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 #, fuzzy msgid "invalid repeat counts in {}" msgstr "\\{\\} içeriÄŸi hatalı" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "Birden fazla '!'" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "Beklenmeyen ','" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "İlk adres olarak +N veya ~N kullanılamaz" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "EÅŸleÅŸmeyen '{'" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "Beklenmeyen '}'" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "Komuttan sonra fazla karakterler var" #: sed/compile.c:168 #, fuzzy msgid "expected \\ after `a', `c' or `i'" msgstr "`a', `c' veya `i' sonrası \\ beklendi" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "'}' için adres istenmez" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": için hiç adres istenmez" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "Açıklamalarda adres kabul edilmez" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "Komut eksik" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "Komutta yalnızca tek adres kullanılır" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "Sonlandırılmamış adres düzenli ifadesi" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "Sonlandırılmamış 's' komutu" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "Sonlandırılmamış 'y' komutu" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "`s' komutuna bilinmeyen seçenek verilmiÅŸ" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "`s' komutuna birden fazla `p' seçeneÄŸi verilmiÅŸ" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "`s' komutuna birden fazla `g' seçeneÄŸi verilmiÅŸ" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "`s' komutuna birden fazla sayı seçeneÄŸi verilmiÅŸ" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "`s' komutuna verilen sayı seçeneÄŸi sıfır olamaz" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "y komutu için dizgeler deÄŸiÅŸik uzunluklarda" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "sed'in daha yeni bir sürümü beklendi" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "Adres deÄŸiÅŸtirici hatalı kullanılmış" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "Bilinmeyen komut:" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s: dosya %s satır %lu: %s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s: -e ifade #%lu, harf %lu: %s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "`%s'e atlamak için etiket bulunamıyor" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s: %s okunamıyor: %s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "%d sayıda öğe %s'e yazılamadı: %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "Geçici dosya %s açılamadı: %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "altsüreçte hata" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr " e' seçeneÄŸi desteklenmiyor" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "`e' komutu desteklenmiyor" #: sed/regexp.c:39 #, fuzzy msgid "no previous regular expression" msgstr "Daha önce düzenli ifade yok" #: sed/regexp.c:40 #, fuzzy msgid "cannot specify modifiers on empty regexp" msgstr "BoÅŸ düzenli ifadeye deÄŸiÅŸtirici atanamaz" #: sed/regexp.c:134 #, fuzzy, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "`s' komutunun RHS'sinde geçersiz \\%d referansı" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" " -R, --regexp-perl\n" " betikte Perl 5'in düzenli ifade sözdizimini kullanır.\n" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, fuzzy, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" " -R, --regexp-perl\n" " betikte Perl 5'in düzenli ifade sözdizimini kullanır.\n" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "Yazılım hatalarını %s adresine, çeviri hatalarını \n" " adresine bildirin. \n" "``%s'' sözcüğünün Konu baÅŸlığında yer almasına dikkat edin. \n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "super-sed sürüm %s\n" #: sed/sed.c:269 #, fuzzy, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" "GNU sed sürümü 3.02.80 temel alınmıştır\n" "\n" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "GNU sed sürümü %s\n" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" "%s\n" "Bu serbest yazılımdır; kopyalama koÅŸulları için kaynak koduna bakınız.\n" "Hiçbir garantisi yoktur; hatta SATILABİLİRLİĞİ veya HERHANGİ BİR AMACA\n" "UYGUNLUÄžU için bile garanti verilmez.\n" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s: %s okunamıyor: %s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "%s dosyası açılamadı: %s" #: lib/utils.c:220 #, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "%d sayıda öğe %s'e yazılamadı: %s" msgstr[1] "%d sayıda öğe %s'e yazılamadı: %s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "%s'de okuma hatası: %s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s: %s okunamıyor: %s\n" #~ msgid "Success" #~ msgstr "BaÅŸarılı" #~ msgid "No match" #~ msgstr "EÅŸleÅŸme bulunamadı" # #~ msgid "Invalid regular expression" #~ msgstr "Hatalı düzenli ifade" #~ msgid "Invalid collation character" #~ msgstr "Hatalı birleÅŸtirme karakteri" #~ msgid "Trailing backslash" #~ msgstr "Sonda fazla gerikesme var" #~ msgid "Invalid back reference" #~ msgstr "Hatalı geri referans" # #~ msgid "Unmatched [ or [^" #~ msgstr "EÅŸleÅŸmeyen [ veya [^" # #~ msgid "Unmatched ( or \\(" #~ msgstr "EÅŸleÅŸmeyen ( veya \\(" # #~ msgid "Unmatched \\{" #~ msgstr "EÅŸleÅŸmeyen \\{" #~ msgid "Invalid range end" #~ msgstr "Geçersiz kapsam sonu" #~ msgid "Memory exhausted" #~ msgstr "Bellek tükendi" # #~ msgid "Invalid preceding regular expression" #~ msgstr "Bir önceki düzenli ifade hatalı" # #~ msgid "Premature end of regular expression" #~ msgstr "Düzenli ifade erken sonlandı" # #~ msgid "Unmatched ) or \\)" #~ msgstr "EÅŸleÅŸmeyen ) or \\)" #~ msgid "No previous regular expression" #~ msgstr "Daha önce düzenli ifade yok" sed-3.62/po/zh_CN.gmo0000644000076600007660000000257610176462005011312 00000000000000•Þ |Ü %!G^xd•ú##=&a,ˆµtÊ!?av‘P¢ó 9Qm   %s: -e expression #%lu, char %lu: %s %s: can't read %s: %s %s: file %s line %lu: %s : doesn't want any addressesE-mail bug reports to: %s . Be sure to include the word ``%s'' somewhere in the ``Subject:'' field. `}' doesn't want any addressesmultiple `g' options to `s' commandmultiple `p' options to `s' commandmultiple number options to `s' commandnumber option to `s' command may not be zeroread error on %s: %sProject-Id-Version: sed 3.02.80 POT-Creation-Date: 2004-11-11 16:32+0100 PO-Revision-Date: 2002-08-18 11:11+0800 Last-Translator: Wang Li Language-Team: Chinese (simplified) MIME-Version: 1.0 Content-Type: text/plain; charset=gb2312 Content-Transfer-Encoding: 8bit Report-Msgid-Bugs-To: Report-Msgid-Bugs-To: %s£º-e ±í´ïʽ #%lu£¬×Ö·û %lu£º%s %s£ºÎÞ·¨¶ÁÈ¡ %s£º%s %s£ºÎļþ %s Ðкţº%lu£º%s : ²»ÐèÒªÈκεØÖ·½«´íÎ󱨸æÍ¨¹ýµç×ÓÓʼþ·¢Ë͵½£º%s . ÇëÎñ±Ø½«µ¥´Ê¡°%s¡±·ÅÔÚ¡°Subject:¡±ÓòµÄij´¦¡£ ¡°}¡±²»ÐèÒªÈκεØÖ·¶à¸ö¡°s¡±ÃüÁîµÄÑ¡Ïî¡°g¡±¶à¸ö¡°s¡±ÃüÁîµÄÑ¡Ïî¡°p¡±¶à¸ö¡°s¡±ÃüÁîµÄÊýֵѡÏî¡°s¡±ÃüÁîµÄÊýֵѡÏî²»ÄÜΪÁã¶ÁÈ¡ %s ³ö´í£º%ssed-3.62/po/zh_CN.po0000644000076600007660000002632410176462003011141 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) 2002 Free Software Foundation, Inc. # Wang Li , 2002. # msgid "" msgstr "" "Project-Id-Version: sed 3.02.80\n" "POT-Creation-Date: 2004-11-11 16:32+0100\n" "PO-Revision-Date: 2002-08-18 11:11+0800\n" "Last-Translator: Wang Li \n" "Language-Team: Chinese (simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=gb2312\n" "Content-Transfer-Encoding: 8bit\n" "Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n" #: pcre/pcregrep.c:130 #, c-format msgid "Usage: pcregrep [-bepchilnsvx] pattern [file] ...\n" msgstr "" #: pcre/pcregrep.c:212 #, fuzzy, c-format msgid "pcregrep: unknown option %c\n" msgstr "¡°s¡±µÄδ֪ѡÏî" #: pcre/pcregrep.c:239 #, c-format msgid "pcregrep: error in regex at offset %d: %s\n" msgstr "" #: pcre/pcregrep.c:248 #, c-format msgid "pcregrep: error while studing regex: %s\n" msgstr "" #: pcre/pcregrep.c:268 #, fuzzy, c-format msgid "pcregrep: failed to open %s: %s\n" msgstr "¶ÁÈ¡ %s ³ö´í£º%s" #: pcre/regexp.c:48 msgid "\\ at end of pattern" msgstr "" #: pcre/regexp.c:49 msgid "\\c at end of pattern" msgstr "" #: pcre/regexp.c:50 msgid "unrecognized character follows \\" msgstr "" #: pcre/regexp.c:51 msgid "numbers out of order in {} quantifier" msgstr "" #: pcre/regexp.c:52 msgid "number too big in {} quantifier" msgstr "" #: pcre/regexp.c:53 pcre/regexp.c:130 msgid "missing terminating ] for character class" msgstr "" #: pcre/regexp.c:54 msgid "invalid escape sequence in character class" msgstr "" #: pcre/regexp.c:55 pcre/regexp.c:136 msgid "range out of order in character class" msgstr "" #: pcre/regexp.c:56 pcre/regexp.c:128 msgid "nothing to repeat" msgstr "" #: pcre/regexp.c:57 msgid "operand of unlimited repeat could match the empty string" msgstr "" #: pcre/regexp.c:58 msgid "internal error: unexpected repeat" msgstr "" #: pcre/regexp.c:59 msgid "unrecognized character after (?" msgstr "" #: pcre/regexp.c:60 msgid "unused error" msgstr "" #: pcre/regexp.c:61 pcre/regexp.c:129 #, fuzzy msgid "unmatched braces" msgstr "δƥÅäµÄ¡°{¡±" #: pcre/regexp.c:62 pcre/regexp.c:139 msgid "back reference to non-existent subpattern" msgstr "" #: pcre/regexp.c:63 msgid "erroffset passed as NULL" msgstr "" #: pcre/regexp.c:64 #, fuzzy msgid "unknown option bit(s) set" msgstr "¡°s¡±µÄδ֪ѡÏî" #: pcre/regexp.c:65 #, fuzzy msgid "missing ) after comment" msgstr "ÒÅ©ÃüÁî" #: pcre/regexp.c:66 msgid "parentheses nested too deeply" msgstr "" #: pcre/regexp.c:67 pcre/regexp.c:137 msgid "regular expression too large" msgstr "" #: pcre/regexp.c:68 pcre/regexp.c:138 msgid "failed to get memory" msgstr "" #: pcre/regexp.c:69 pcre/regexp.c:135 msgid "unmatched parentheses" msgstr "" #: pcre/regexp.c:70 msgid "internal error: code overflow" msgstr "" #: pcre/regexp.c:71 msgid "unrecognized character after (?<" msgstr "" #: pcre/regexp.c:72 msgid "lookbehind assertion is not fixed length" msgstr "" #: pcre/regexp.c:73 msgid "malformed number after (?(" msgstr "" #: pcre/regexp.c:74 msgid "conditional group contains more than two branches" msgstr "" #: pcre/regexp.c:75 msgid "assertion expected after (?(" msgstr "" #: pcre/regexp.c:76 msgid "(?p must be followed by )" msgstr "" #: pcre/regexp.c:77 pcre/regexp.c:132 msgid "unknown POSIX class name" msgstr "" #: pcre/regexp.c:78 msgid "POSIX collating elements are not supported" msgstr "" #: pcre/regexp.c:79 msgid "bad condition (?(0)" msgstr "" #: pcre/regexp.c:125 msgid "internal error" msgstr "" #: pcre/regexp.c:126 msgid "invalid repeat counts in {}" msgstr "" #: pcre/regexp.c:127 msgid "pattern error" msgstr "" #: pcre/regexp.c:131 msgid "bad collating element" msgstr "" #: pcre/regexp.c:133 msgid "bad escape sequence" msgstr "" #: pcre/regexp.c:134 msgid "empty expression" msgstr "" #: pcre/regexp.c:140 msgid "bad argument" msgstr "" #: pcre/regexp.c:141 msgid "match failed" msgstr "" #: pcre/regexp.c:182 msgid "unknown error code" msgstr "" #: pcre/regexp.c:184 #, c-format msgid "%s at offset %-6d" msgstr "" #: sed/compile.c:162 #, fuzzy msgid "multiple `!'s" msgstr "¶à¸ö¡°!¡±" #: sed/compile.c:163 #, fuzzy msgid "unexpected `,'" msgstr "ÒâÍâµÄ¡°,¡±" #: sed/compile.c:164 #, fuzzy msgid "invalid usage of +N or ~N as first address" msgstr "ÎÞ·¨½« +N »ò ~N ×÷ΪµÚÒ»¸öµØÖ·" #: sed/compile.c:165 #, fuzzy msgid "unmatched `{'" msgstr "δƥÅäµÄ¡°{¡±" #: sed/compile.c:166 #, fuzzy msgid "unexpected `}'" msgstr "δƥÅäµÄ¡°}¡±" #: sed/compile.c:167 #, fuzzy msgid "extra characters after command" msgstr "ÃüÁîºóº¬ÓжàÓàµÄ×Ö·û" #: sed/compile.c:168 msgid "expected \\ after `a', `c' or `i'" msgstr "" #: sed/compile.c:169 msgid "`}' doesn't want any addresses" msgstr "¡°}¡±²»ÐèÒªÈκεØÖ·" #: sed/compile.c:170 msgid ": doesn't want any addresses" msgstr ": ²»ÐèÒªÈκεØÖ·" #: sed/compile.c:171 #, fuzzy msgid "comments don't accept any addresses" msgstr "×¢ÊͲ»½ÓÊÜÈκεØÖ·" #: sed/compile.c:172 #, fuzzy msgid "missing command" msgstr "ÒÅ©ÃüÁî" #: sed/compile.c:173 #, fuzzy msgid "command only uses one address" msgstr "ÃüÁîֻʹÓÃÒ»¸öµØÖ·" #: sed/compile.c:174 #, fuzzy msgid "unterminated address regex" msgstr "δÖÕÖ¹µÄµØÖ·³£¹æ±í´ïʽ" #: sed/compile.c:175 #, fuzzy msgid "unterminated `s' command" msgstr "δÖÕÖ¹µÄ¡°s¡±ÃüÁî" #: sed/compile.c:176 #, fuzzy msgid "unterminated `y' command" msgstr "δÖÕÖ¹µÄ¡°y¡±ÃüÁî" #: sed/compile.c:177 #, fuzzy msgid "unknown option to `s'" msgstr "¡°s¡±µÄδ֪ѡÏî" #: sed/compile.c:178 msgid "multiple `p' options to `s' command" msgstr "¶à¸ö¡°s¡±ÃüÁîµÄÑ¡Ïî¡°p¡±" #: sed/compile.c:179 msgid "multiple `g' options to `s' command" msgstr "¶à¸ö¡°s¡±ÃüÁîµÄÑ¡Ïî¡°g¡±" #: sed/compile.c:180 msgid "multiple number options to `s' command" msgstr "¶à¸ö¡°s¡±ÃüÁîµÄÊýֵѡÏî" #: sed/compile.c:181 msgid "number option to `s' command may not be zero" msgstr "¡°s¡±ÃüÁîµÄÊýֵѡÏî²»ÄÜΪÁã" #: sed/compile.c:182 #, fuzzy msgid "strings for `y' command are different lengths" msgstr "y ÃüÁîµÄ×Ö·û´®³¤¶È²»Í¬" #: sed/compile.c:183 msgid "delimiter character is not a single-byte character" msgstr "" #: sed/compile.c:184 msgid "expected newer version of sed" msgstr "" #: sed/compile.c:185 #, fuzzy msgid "invalid usage of line address 0" msgstr "·Ç·¨Ê¹ÓõØÖ·ÐÞÊηû" #: sed/compile.c:186 #, fuzzy, c-format msgid "unknown command: `%c'" msgstr "δ֪µÄÃüÁ" #: sed/compile.c:209 #, c-format msgid "%s: file %s line %lu: %s\n" msgstr "%s£ºÎļþ %s Ðкţº%lu£º%s\n" #: sed/compile.c:212 #, c-format msgid "%s: -e expression #%lu, char %lu: %s\n" msgstr "%s£º-e ±í´ïʽ #%lu£¬×Ö·û %lu£º%s\n" #: sed/compile.c:1644 #, fuzzy, c-format msgid "can't find label for jump to `%s'" msgstr "ÎÞ·¨ÎªÄ¿µÄΪ¡°%s¡±µÄÌø×ªÕÒµ½±êÇ©" #: sed/execute.c:649 #, c-format msgid "%s: can't read %s: %s\n" msgstr "%s£ºÎÞ·¨¶ÁÈ¡ %s£º%s\n" #: sed/execute.c:672 #, fuzzy, c-format msgid "couldn't edit %s: is a terminal" msgstr "ÎÞ·¨´ò¿ªÎļþ %s" #: sed/execute.c:676 #, c-format msgid "couldn't edit %s: not a regular file" msgstr "" #: lib/utils.c:196 sed/execute.c:683 #, fuzzy, c-format msgid "couldn't open temporary file %s: %s" msgstr "ÎÞ·¨´ò¿ªÎļþ %s" #: sed/execute.c:1207 sed/execute.c:1388 msgid "error in subprocess" msgstr "" #: sed/execute.c:1209 msgid "option `e' not supported" msgstr "" #: sed/execute.c:1390 msgid "`e' command not supported" msgstr "" #: sed/regexp.c:39 msgid "no previous regular expression" msgstr "" #: sed/regexp.c:40 msgid "cannot specify modifiers on empty regexp" msgstr "" #: sed/regexp.c:134 #, c-format msgid "invalid reference \\%d on `s' command's RHS" msgstr "" #: sed/sed.c:93 msgid "" " -R, --regexp-perl\n" " use Perl 5's regular expressions syntax in the script.\n" msgstr "" #: sed/sed.c:98 #, c-format msgid "" "Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n" "\n" msgstr "" #: sed/sed.c:102 #, c-format msgid "" " -n, --quiet, --silent\n" " suppress automatic printing of pattern space\n" msgstr "" #: sed/sed.c:104 #, c-format msgid "" " -e script, --expression=script\n" " add the script to the commands to be executed\n" msgstr "" #: sed/sed.c:106 #, c-format msgid "" " -f script-file, --file=script-file\n" " add the contents of script-file to the commands to be " "executed\n" msgstr "" #: sed/sed.c:108 #, c-format msgid "" " -i[SUFFIX], --in-place[=SUFFIX]\n" " edit files in place (makes backup if extension supplied)\n" msgstr "" #: sed/sed.c:110 #, c-format msgid "" " -l N, --line-length=N\n" " specify the desired line-wrap length for the `l' command\n" msgstr "" #: sed/sed.c:112 #, c-format msgid "" " --posix\n" " disable all GNU extensions.\n" msgstr "" #: sed/sed.c:114 #, c-format msgid "" " -r, --regexp-extended\n" " use extended regular expressions in the script.\n" msgstr "" #: sed/sed.c:117 #, c-format msgid "" " -s, --separate\n" " consider files as separate rather than as a single " "continuous\n" " long stream.\n" msgstr "" #: sed/sed.c:120 #, c-format msgid "" " -u, --unbuffered\n" " load minimal amounts of data from the input files and " "flush\n" " the output buffers more often\n" msgstr "" #: sed/sed.c:123 #, c-format msgid " --help display this help and exit\n" msgstr "" #: sed/sed.c:124 #, c-format msgid " --version output version information and exit\n" msgstr "" #: sed/sed.c:125 #, c-format msgid "" "\n" "If no -e, --expression, -f, or --file option is given, then the first\n" "non-option argument is taken as the sed script to interpret. All\n" "remaining arguments are names of input files; if no input files are\n" "specified, then the standard input is read.\n" "\n" msgstr "" #: sed/sed.c:131 #, c-format msgid "" "E-mail bug reports to: %s .\n" "Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n" msgstr "" "½«´íÎ󱨸æÍ¨¹ýµç×ÓÓʼþ·¢Ë͵½£º%s .\n" "ÇëÎñ±Ø½«µ¥´Ê¡°%s¡±·ÅÔÚ¡°Subject:¡±ÓòµÄij´¦¡£\n" #: sed/sed.c:268 #, c-format msgid "super-sed version %s\n" msgstr "" #: sed/sed.c:269 #, c-format msgid "" "based on GNU sed version %s\n" "\n" msgstr "" #: sed/sed.c:271 #, c-format msgid "GNU sed version %s\n" msgstr "" #: sed/sed.c:273 #, c-format msgid "" "%s\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n" "to the extent permitted by law.\n" msgstr "" #: lib/utils.c:98 lib/utils.c:336 #, fuzzy, c-format msgid "cannot remove %s: %s" msgstr "%s£ºÎÞ·¨¶ÁÈ¡ %s£º%s\n" #: lib/utils.c:143 #, fuzzy, c-format msgid "couldn't open file %s: %s" msgstr "ÎÞ·¨´ò¿ªÎļþ %s" #: lib/utils.c:220 #, fuzzy, c-format msgid "couldn't write %d item to %s: %s" msgid_plural "couldn't write %d items to %s: %s" msgstr[0] "ÎÞ·¨½« %d ¸öÏîĿдÈë %s£º%s" msgstr[1] "ÎÞ·¨½« %d ¸öÏîĿдÈë %s£º%s" #: lib/utils.c:235 lib/utils.c:251 #, c-format msgid "read error on %s: %s" msgstr "¶ÁÈ¡ %s ³ö´í£º%s" #: lib/utils.c:341 #, fuzzy, c-format msgid "cannot rename %s: %s" msgstr "%s£ºÎÞ·¨¶ÁÈ¡ %s£º%s\n" #, fuzzy #~ msgid "Unmatched [ or [^" #~ msgstr "δƥÅäµÄ¡°{¡±" #, fuzzy #~ msgid "Unmatched ( or \\(" #~ msgstr "δƥÅäµÄ¡°{¡±" #, fuzzy #~ msgid "Unmatched \\{" #~ msgstr "δƥÅäµÄ¡°{¡±" #, fuzzy #~ msgid "Unmatched ) or \\)" #~ msgstr "δƥÅäµÄ¡°{¡±" sed-3.62/sed/0000777000076600007660000000000010202633244010007 500000000000000sed-3.62/sed/Makefile.am0000644000076600007660000000076710143133571011773 00000000000000## Process this file with automake to produce Makefile.in bin_PROGRAMS = sed localedir = $(datadir)/locale sed_SOURCES = sed.c compile.c execute.c regexp.c fmt.c mbcs.c noinst_HEADERS = sed.h AM_CPPFLAGS = -I$(top_srcdir)/lib -I$(top_srcdir)/intl -I$(top_srcdir)/pcre \ -I$(top_srcdir) -I$(top_builddir)/lib \ -I$(top_builddir)/intl -DLOCALEDIR=\"$(localedir)\" sed_LDADD = ../pcre/libpcre.a ../lib/libsed.a @INTLLIBS@ sed_DEPENDENCIES = ../pcre/libpcre.a ../lib/libsed.a $(PROGRAMS): $(LDADD) sed-3.62/sed/Makefile.in0000644000076600007660000003603010202173550011771 00000000000000# Makefile.in generated by automake 1.9.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(sed_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = sed$(EXEEXT) subdir = sed DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/codeset.m4 \ $(top_srcdir)/config/getline.m4 \ $(top_srcdir)/config/gettext-ver.m4 \ $(top_srcdir)/config/gettext.m4 \ $(top_srcdir)/config/glibc21.m4 $(top_srcdir)/config/iconv.m4 \ $(top_srcdir)/config/lcmessage.m4 \ $(top_srcdir)/config/lib-ld.m4 \ $(top_srcdir)/config/lib-link.m4 \ $(top_srcdir)/config/lib-prefix.m4 \ $(top_srcdir)/config/progtest.m4 \ $(top_srcdir)/config/stdbool.m4 \ $(top_srcdir)/config/strverscmp.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_sed_OBJECTS = sed.$(OBJEXT) compile.$(OBJEXT) execute.$(OBJEXT) \ regexp.$(OBJEXT) fmt.$(OBJEXT) mbcs.$(OBJEXT) sed_OBJECTS = $(am_sed_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(sed_SOURCES) DIST_SOURCES = $(sed_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HTML_FALSE = @BUILD_HTML_FALSE@ BUILD_HTML_TRUE = @BUILD_HTML_TRUE@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ HAVE__BOOL = @HAVE__BOOL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKEINFO_HTML_FALSE = @MAKEINFO_HTML_FALSE@ MAKEINFO_HTML_TRUE = @MAKEINFO_HTML_TRUE@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCREGREP = @PCREGREP@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED_FEATURE_VERSION = @SED_FEATURE_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TEXI2HTML = @TEXI2HTML@ TEXI2HTML_HTML_FALSE = @TEXI2HTML_HTML_FALSE@ TEXI2HTML_HTML_TRUE = @TEXI2HTML_HTML_TRUE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ localedir = $(datadir)/locale sed_SOURCES = sed.c compile.c execute.c regexp.c fmt.c mbcs.c noinst_HEADERS = sed.h AM_CPPFLAGS = -I$(top_srcdir)/lib -I$(top_srcdir)/intl -I$(top_srcdir)/pcre \ -I$(top_srcdir) -I$(top_builddir)/lib \ -I$(top_builddir)/intl -DLOCALEDIR=\"$(localedir)\" sed_LDADD = ../pcre/libpcre.a ../lib/libsed.a @INTLLIBS@ sed_DEPENDENCIES = ../pcre/libpcre.a ../lib/libsed.a all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits sed/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnits sed/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) installcheck-binPROGRAMS: $(bin_PROGRAMS) bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \ esac; \ f=`echo "$$p" | \ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ for opt in --help --version; do \ if "$(DESTDIR)$(bindir)/$$f" $$opt > c$${pid}_.out 2> c$${pid}_.err \ && test -n "`cat c$${pid}_.out`" \ && test -z "`cat c$${pid}_.err`"; then :; \ else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \ done; \ done; rm -f c$${pid}_.???; exit $$bad sed$(EXEEXT): $(sed_OBJECTS) $(sed_DEPENDENCIES) @rm -f sed$(EXEEXT) $(LINK) $(sed_LDFLAGS) $(sed_OBJECTS) $(sed_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbcs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regexp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sed.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-binPROGRAMS install-info: install-info-am install-man: installcheck-am: installcheck-binPROGRAMS maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installcheck-binPROGRAMS \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-info-am $(PROGRAMS): $(LDADD) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: sed-3.62/sed/compile.c0000644000076600007660000012230210163557763011540 00000000000000/* GNU SED, a batch stream editor. Copyright (C) 1989,90,91,92,93,94,95,98,99,2002,2003 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* compile.c: translate sed source into internal form */ #include "sed.h" #include "strverscmp.h" #include #include #ifdef HAVE_STRINGS_H # include # ifdef HAVE_MEMORY_H # include # endif #else # include #endif /* HAVE_STRINGS_H */ #ifdef HAVE_STDLIB_H # include #endif #ifndef EXIT_FAILURE # define EXIT_FAILURE 1 #endif #ifdef HAVE_SYS_TYPES_H # include #endif #include #define YMAP_LENGTH 256 /*XXX shouldn't this be (UCHAR_MAX+1)?*/ #define VECTOR_ALLOC_INCREMENT 40 /* let's not confuse text editors that have only dumb bracket-matching... */ #define OPEN_BRACKET '[' #define CLOSE_BRACKET ']' #define OPEN_BRACE '{' #define CLOSE_BRACE '}' struct prog_info { /* When we're reading a script command from a string, `prog.base' points to the first character in the string, 'prog.cur' points to the current character in the string, and 'prog.end' points to the end of the string. This allows us to compile script strings that contain nulls. */ const unsigned char *base; const unsigned char *cur; const unsigned char *end; /* This is the current script file. If it is NULL, we are reading from a string stored at `prog.cur' instead. If both `prog.file' and `prog.cur' are NULL, we're in trouble! */ FILE *file; }; /* Information used to give out useful and informative error messages. */ struct error_info { /* This is the name of the current script file. */ const char *name; /* This is the number of the current script line that we're compiling. */ countT line; /* This is the index of the "-e" expressions on the command line. */ countT string_expr_count; }; /* Label structure used to resolve GOTO's, labels, and block beginnings. */ struct sed_label { countT v_index; /* index of vector element being referenced */ char *name; /* NUL-terminated name of the label */ struct error_info err_info; /* track where `{}' blocks start */ struct sed_label *next; /* linked list (stack) */ }; struct special_files { struct output outf; FILE **pfp; }; FILE *my_stdin, *my_stdout, *my_stderr; struct special_files special_files[] = { { { "/dev/stdin", false, NULL, NULL }, &my_stdin }, { { "/dev/stdout", false, NULL, NULL }, &my_stdout }, { { "/dev/stderr", false, NULL, NULL }, &my_stderr }, { { NULL, false, NULL, NULL }, NULL } }; /* Where we are in the processing of the input. */ static struct prog_info prog; static struct error_info cur_input; /* Information about labels and jumps-to-labels. This is used to do the required backpatching after we have compiled all the scripts. */ static struct sed_label *jumps = NULL; static struct sed_label *labels = NULL; /* We wish to detect #n magic only in the first input argument; this flag tracks when we have consumed the first file of input. */ static bool first_script = true; /* Allow for scripts like "sed -e 'i\' -e foo": */ static struct buffer *pending_text = NULL; static struct text_buf *old_text_buf = NULL; /* Information about block start positions. This is used to backpatch block end positions. */ static struct sed_label *blocks = NULL; /* Use an obstack for compilation. */ static struct obstack obs; /* Various error messages we may want to print */ static const char errors[] = "multiple `!'s\0" "unexpected `,'\0" "invalid usage of +N or ~N as first address\0" "unmatched `{'\0" "unexpected `}'\0" "extra characters after command\0" "expected \\ after `a', `c' or `i'\0" "`}' doesn't want any addresses\0" ": doesn't want any addresses\0" "comments don't accept any addresses\0" "missing command\0" "command only uses one address\0" "unterminated address regex\0" "unterminated `s' command\0" "unterminated `y' command\0" "unknown option to `s'\0" "multiple `p' options to `s' command\0" "multiple `g' options to `s' command\0" "multiple number options to `s' command\0" "number option to `s' command may not be zero\0" "strings for `y' command are different lengths\0" "delimiter character is not a single-byte character\0" "expected newer version of sed\0" "invalid usage of line address 0\0" "unknown command: `%c'"; #define BAD_BANG (errors) #define BAD_COMMA (BAD_BANG + sizeof(N_("multiple `!'s"))) #define BAD_STEP (BAD_COMMA + sizeof(N_("unexpected `,'"))) #define EXCESS_OPEN_BRACE (BAD_STEP + sizeof(N_("invalid usage of +N or ~N as first address"))) #define EXCESS_CLOSE_BRACE (EXCESS_OPEN_BRACE + sizeof(N_("unmatched `{'"))) #define EXCESS_JUNK (EXCESS_CLOSE_BRACE + sizeof(N_("unexpected `}'"))) #define EXPECTED_SLASH (EXCESS_JUNK + sizeof(N_("extra characters after command"))) #define NO_CLOSE_BRACE_ADDR (EXPECTED_SLASH + sizeof(N_("expected \\ after `a', `c' or `i'"))) #define NO_COLON_ADDR (NO_CLOSE_BRACE_ADDR + sizeof(N_("`}' doesn't want any addresses"))) #define NO_SHARP_ADDR (NO_COLON_ADDR + sizeof(N_(": doesn't want any addresses"))) #define NO_COMMAND (NO_SHARP_ADDR + sizeof(N_("comments don't accept any addresses"))) #define ONE_ADDR (NO_COMMAND + sizeof(N_("missing command"))) #define UNTERM_ADDR_RE (ONE_ADDR + sizeof(N_("command only uses one address"))) #define UNTERM_S_CMD (UNTERM_ADDR_RE + sizeof(N_("unterminated address regex"))) #define UNTERM_Y_CMD (UNTERM_S_CMD + sizeof(N_("unterminated `s' command"))) #define UNKNOWN_S_OPT (UNTERM_Y_CMD + sizeof(N_("unterminated `y' command"))) #define EXCESS_P_OPT (UNKNOWN_S_OPT + sizeof(N_("unknown option to `s'"))) #define EXCESS_G_OPT (EXCESS_P_OPT + sizeof(N_("multiple `p' options to `s' command"))) #define EXCESS_N_OPT (EXCESS_G_OPT + sizeof(N_("multiple `g' options to `s' command"))) #define ZERO_N_OPT (EXCESS_N_OPT + sizeof(N_("multiple number options to `s' command"))) #define Y_CMD_LEN (ZERO_N_OPT + sizeof(N_("number option to `s' command may not be zero"))) #define BAD_DELIM (Y_CMD_LEN + sizeof(N_("strings for `y' command are different lengths"))) #define ANCIENT_VERSION (BAD_DELIM + sizeof(N_("delimiter character is not a single-byte character"))) #define INVALID_LINE_0 (ANCIENT_VERSION + sizeof(N_("expected newer version of sed"))) #define UNKNOWN_CMD (INVALID_LINE_0 + sizeof(N_("invalid usage of line address 0"))) #define END_ERRORS (UNKNOWN_CMD + sizeof(N_("unknown command: `%c'"))) static struct output *file_read = NULL; static struct output *file_write = NULL; /* Complain about an unknown command and exit. */ void bad_command(ch) char ch; { const char *msg = _(UNKNOWN_CMD); char *unknown_cmd = xmalloc(strlen(msg)); sprintf(unknown_cmd, msg, ch); bad_prog(unknown_cmd); } /* Complain about a programming error and exit. */ void bad_prog(why) const char *why; { if (cur_input.name) fprintf(stderr, _("%s: file %s line %lu: %s\n"), myname, cur_input.name, CAST(unsigned long)cur_input.line, why); else fprintf(stderr, _("%s: -e expression #%lu, char %lu: %s\n"), myname, CAST(unsigned long)cur_input.string_expr_count, CAST(unsigned long)(prog.cur-prog.base), why); exit(EXIT_FAILURE); } /* Read the next character from the program. Return EOF if there isn't anything to read. Keep cur_input.line up to date, so error messages can be meaningful. */ static int inchar P_((void)); static int inchar() { int ch = EOF; if (prog.cur) { if (prog.cur < prog.end) ch = *prog.cur++; } else if (prog.file) { if (!feof(prog.file)) ch = getc(prog.file); } if (ch == '\n') ++cur_input.line; return ch; } /* unget `ch' so the next call to inchar will return it. */ static void savchar P_((int ch)); static void savchar(ch) int ch; { if (ch == EOF) return; if (ch == '\n' && cur_input.line > 0) --cur_input.line; if (prog.cur) { if (prog.cur <= prog.base || *--prog.cur != ch) panic("Called savchar() with unexpected pushback (%x)", CAST(unsigned char)ch); } else ungetc(ch, prog.file); } /* Read the next non-blank character from the program. */ static int in_nonblank P_((void)); static int in_nonblank() { int ch; do ch = inchar(); while (ISBLANK(ch)); return ch; } /* Read an integer value from the program. */ static countT in_integer P_((int ch)); static countT in_integer(ch) int ch; { countT num = 0; while (ISDIGIT(ch)) { num = num * 10 + ch - '0'; ch = inchar(); } savchar(ch); return num; } static int add_then_next P_((struct buffer *b, int ch)); static int add_then_next(b, ch) struct buffer *b; int ch; { add1_buffer(b, ch); return inchar(); } static char * convert_number P_((char *, char *, const char *, int, int, int)); static char * convert_number(result, buf, bufend, base, maxdigits, default_char) char *result; char *buf; const char *bufend; int base; int maxdigits; int default_char; { int n = 0; char *p; for (p=buf; p < bufend && maxdigits-- > 0; ++p) { int d = -1; switch (*p) { case '0': d = 0x0; break; case '1': d = 0x1; break; case '2': d = 0x2; break; case '3': d = 0x3; break; case '4': d = 0x4; break; case '5': d = 0x5; break; case '6': d = 0x6; break; case '7': d = 0x7; break; case '8': d = 0x8; break; case '9': d = 0x9; break; case 'A': case 'a': d = 0xa; break; case 'B': case 'b': d = 0xb; break; case 'C': case 'c': d = 0xc; break; case 'D': case 'd': d = 0xd; break; case 'E': case 'e': d = 0xe; break; case 'F': case 'f': d = 0xf; break; } if (d < 0 || base <= d) break; n = n * base + d; } if (p == buf) *result = default_char; else *result = n; return p; } /* Read in a filename for a `r', `w', or `s///w' command. */ static struct buffer *read_filename P_((void)); static struct buffer * read_filename() { struct buffer *b; int ch; b = init_buffer(); ch = in_nonblank(); while (ch != EOF && ch != '\n') { #if 0 /*XXX ZZZ 1998-09-12 kpp: added, then had second thoughts*/ if (posixicity == POSIXLY_EXTENDED) if (ch == ';' || ch == '#') { savchar(ch); break; } #endif ch = add_then_next(b, ch); } add1_buffer(b, '\0'); return b; } static struct output *get_openfile P_((struct output **file_ptrs, char *mode, bool fail)); static struct output * get_openfile(file_ptrs, mode, fail) struct output **file_ptrs; char *mode; bool fail; { struct buffer *b; char *file_name; struct output *p; int is_stderr; b = read_filename(); file_name = get_buffer(b); for (p=*file_ptrs; p; p=p->link) if (strcmp(p->name, file_name) == 0) break; if (posixicity == POSIXLY_EXTENDED) { /* Check whether it is a special file (stdin, stdout or stderr) */ struct special_files *special = special_files; /* std* sometimes are not constants, so they cannot be used in the initializer for special_files */ my_stdin = stdin; my_stdout = stdout; my_stderr = stderr; for (special = special_files; special->outf.name; special++) if (strcmp(special->outf.name, file_name) == 0) { special->outf.fp = *special->pfp; free_buffer (b); return &special->outf; } } if (!p) { p = OB_MALLOC(&obs, 1, struct output); p->name = ck_strdup(file_name); p->fp = ck_fopen(p->name, mode, fail); p->missing_newline = false; p->link = *file_ptrs; *file_ptrs = p; } free_buffer(b); return p; } static struct sed_cmd *next_cmd_entry P_((struct vector **vectorp)); static struct sed_cmd * next_cmd_entry(vectorp) struct vector **vectorp; { struct sed_cmd *cmd; struct vector *v; v = *vectorp; if (v->v_length == v->v_allocated) { v->v_allocated += VECTOR_ALLOC_INCREMENT; v->v = REALLOC(v->v, v->v_allocated, struct sed_cmd); } cmd = v->v + v->v_length; cmd->a1 = NULL; cmd->a2 = NULL; cmd->range_state = RANGE_INACTIVE; cmd->addr_bang = false; cmd->cmd = '\0'; /* something invalid, to catch bugs early */ *vectorp = v; return cmd; } static int snarf_char_class P_((struct buffer *b, mbstate_t *cur_stat)); static int snarf_char_class(b, cur_stat) struct buffer *b; mbstate_t *cur_stat; { int ch; int state = 0; int delim; bool pending_mb = 0; ch = inchar(); if (ch == '^') ch = add_then_next(b, ch); else if (ch == CLOSE_BRACKET) ch = add_then_next(b, ch); /* States are: 0 outside a collation element, character class or collation class 1 after the bracket 2 after the opening ./:/= 3 after the closing ./:/= */ for (;; ch = add_then_next (b, ch)) { pending_mb = BRLEN (ch, cur_stat) != 1; switch (ch) { case EOF: case '\n': return ch; case '.': case ':': case '=': if (pending_mb) continue; if (state == 1) { delim = ch; state++; } else if (ch == delim && state == 2) state++; else break; continue; case OPEN_BRACKET: if (pending_mb) continue; state++; continue; case CLOSE_BRACKET: if (pending_mb) continue; if (state == 0 || state == 1) return ch; else if (state == 3) state = 0; break; default: break; } /* Getting a character different from .=: whilst in state 1 goes back to state 0, getting a character different from ] whilst in state 3 goes back to state 2. */ state &= ~1; } } static struct buffer *match_slash P_((int slash, bool regex)); static struct buffer * match_slash(slash, regex) int slash; bool regex; { struct buffer *b; int ch; bool pending_mb = false; mbstate_t cur_stat; memset (&cur_stat, 0, sizeof (mbstate_t)); if (BRLEN (slash, &cur_stat) == -2) if (BRLEN (slash, &cur_stat) == -2) bad_prog (BAD_DELIM); memset (&cur_stat, 0, sizeof (mbstate_t)); b = init_buffer(); while ((ch = inchar()) != EOF && ch != '\n') { pending_mb = BRLEN (ch, &cur_stat) != 1; pending_mb = BRLEN (ch, &cur_stat) != 1; if (!pending_mb) { if (ch == slash) return b; else if (ch == '\\') { ch = inchar(); if (ch == EOF) break; #ifndef REG_PERL else if (ch == 'n' && regex) ch = '\n'; #endif else if (ch != '\n' && ch != slash) add1_buffer(b, '\\'); } else if (ch == OPEN_BRACKET && regex) { add1_buffer(b, ch); ch = snarf_char_class(b, &cur_stat); if (ch != CLOSE_BRACKET) break; } } add1_buffer(b, ch); } if (ch == '\n') savchar(ch); /* for proper line number in error report */ free_buffer(b); return NULL; } static int mark_subst_opts P_((struct subst *cmd)); static int mark_subst_opts(cmd) struct subst *cmd; { int flags = 0; int ch; cmd->global = false; cmd->print = false; cmd->eval = false; cmd->numb = 0; cmd->outf = NULL; for (;;) switch ( (ch = in_nonblank()) ) { case 'i': /* GNU extension */ case 'I': /* GNU extension */ flags |= REG_ICASE; break; #ifdef REG_PERL case 's': /* GNU extension */ case 'S': /* GNU extension */ if (extended_regexp_flags & REG_PERL) flags |= REG_DOTALL; break; case 'x': /* GNU extension */ case 'X': /* GNU extension */ if (extended_regexp_flags & REG_PERL) flags |= REG_EXTENDED; break; #endif case 'm': /* GNU extension */ case 'M': /* GNU extension */ flags |= REG_NEWLINE; break; case 'e': cmd->eval = true; break; case 'p': if (cmd->print) bad_prog(_(EXCESS_P_OPT)); cmd->print |= (1 << cmd->eval); /* 1=before eval, 2=after */ break; case 'g': if (cmd->global) bad_prog(_(EXCESS_G_OPT)); cmd->global = true; break; case 'w': cmd->outf = get_openfile(&file_write, "w", true); return flags; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (cmd->numb) bad_prog(_(EXCESS_N_OPT)); cmd->numb = in_integer(ch); if (!cmd->numb) bad_prog(_(ZERO_N_OPT)); break; case CLOSE_BRACE: case '#': savchar(ch); /* Fall Through */ case EOF: case '\n': case ';': return flags; case '\r': if (inchar() == '\n') return flags; /* FALLTHROUGH */ default: bad_prog(_(UNKNOWN_S_OPT)); /*NOTREACHED*/ } } /* read in a label for a `:', `b', or `t' command */ static char *read_label P_((void)); static char * read_label() { struct buffer *b; int ch; char *ret; b = init_buffer(); ch = in_nonblank(); while (ch != EOF && ch != '\n' && !ISBLANK(ch) && ch != ';' && ch != CLOSE_BRACE && ch != '#') ch = add_then_next (b, ch); savchar(ch); add1_buffer(b, '\0'); ret = ck_strdup(get_buffer(b)); free_buffer(b); return ret; } /* Store a label (or label reference) created by a `:', `b', or `t' command so that the jump to/from the label can be backpatched after compilation is complete, or a reference created by a `{' to be backpatched when the corresponding `}' is found. */ static struct sed_label *setup_label P_((struct sed_label *, countT, char *, const struct error_info *)); static struct sed_label * setup_label(list, idx, name, err_info) struct sed_label *list; countT idx; char *name; const struct error_info *err_info; { struct sed_label *ret = OB_MALLOC(&obs, 1, struct sed_label); ret->v_index = idx; ret->name = name; if (err_info) MEMCPY(&ret->err_info, err_info, sizeof (ret->err_info)); ret->next = list; return ret; } static struct sed_label *release_label P_((struct sed_label *list_head)); static struct sed_label * release_label(list_head) struct sed_label *list_head; { struct sed_label *ret; if (!list_head) return NULL; ret = list_head->next; FREE(list_head->name); #if 0 /* We use obstacks */ FREE(list_head); #endif return ret; } static struct replacement *new_replacement P_((char *, size_t, enum replacement_types)); static struct replacement * new_replacement(text, length, type) char *text; size_t length; enum replacement_types type; { struct replacement *r = OB_MALLOC(&obs, 1, struct replacement); r->prefix = text; r->prefix_length = length; r->subst_id = -1; r->repl_type = type; /* r-> next = NULL; */ return r; } static void setup_replacement P_((struct subst *, const char *, size_t)); static void setup_replacement(sub, text, length) struct subst *sub; const char *text; size_t length; { char *base; char *p; char *text_end; enum replacement_types repl_type = REPL_ASIS, save_type = REPL_ASIS; struct replacement root; struct replacement *tail; sub->max_id = 0; base = MEMDUP(text, length, char); length = normalize_text(base, length, TEXT_REPLACEMENT); text_end = base + length; tail = &root; for (p=base; pnext = new_replacement(base, CAST(size_t)(p - base), repl_type); repl_type = save_type; /* Skip the backslash and look for a numeric back-reference, or a case-munging escape if not in POSIX mode: */ ++p; if (p < text_end && (posixicity != POSIXLY_BASIC || ISDIGIT (*p))) switch (*p) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': tail->subst_id = *p - '0'; if (sub->max_id < tail->subst_id) sub->max_id = tail->subst_id; break; case 'L': repl_type = REPL_LOWERCASE; save_type = REPL_LOWERCASE; break; case 'U': repl_type = REPL_UPPERCASE; save_type = REPL_UPPERCASE; break; case 'E': repl_type = REPL_ASIS; save_type = REPL_ASIS; break; case 'l': save_type = repl_type; repl_type |= REPL_LOWERCASE_FIRST; break; case 'u': save_type = repl_type; repl_type |= REPL_UPPERCASE_FIRST; break; default: p[-1] = *p; ++tail->prefix_length; } base = p + 1; } else if (*p == '&') { /* Preceding the ampersand may be some literal text: */ tail = tail->next = new_replacement(base, CAST(size_t)(p - base), repl_type); repl_type = save_type; tail->subst_id = 0; base = p + 1; } } /* There may be some trailing literal text: */ if (base < text_end) tail = tail->next = new_replacement(base, CAST(size_t)(text_end - base), repl_type); tail->next = NULL; sub->replacement = root.next; } static void read_text P_((struct text_buf *buf, int leadin_ch)); static void read_text(buf, leadin_ch) struct text_buf *buf; int leadin_ch; { int ch; /* Should we start afresh (as opposed to continue a partial text)? */ if (buf) { if (pending_text) free_buffer(pending_text); pending_text = init_buffer(); buf->text = NULL; buf->text_length = 0; old_text_buf = buf; } /* assert(old_text_buf != NULL); */ if (leadin_ch == EOF) return; if (leadin_ch != '\n') add1_buffer(pending_text, leadin_ch); ch = inchar(); while (ch != EOF && ch != '\n') { if (ch == '\\') { ch = inchar(); if (ch != EOF) add1_buffer (pending_text, '\\'); } if (ch == EOF) { add1_buffer (pending_text, '\n'); return; } ch = add_then_next (pending_text, ch); } add1_buffer(pending_text, '\n'); if (!buf) buf = old_text_buf; buf->text_length = normalize_text (get_buffer (pending_text), size_buffer (pending_text), TEXT_BUFFER); buf->text = MEMDUP(get_buffer(pending_text), buf->text_length, char); free_buffer(pending_text); pending_text = NULL; } /* Try to read an address for a sed command. If it succeeds, return non-zero and store the resulting address in `*addr'. If the input doesn't look like an address read nothing and return zero. */ static bool compile_address P_((struct addr *addr, int ch)); static bool compile_address(addr, ch) struct addr *addr; int ch; { addr->addr_type = ADDR_IS_NULL; addr->addr_step = 0; addr->addr_number = ~(countT)0; /* extremely unlikely to ever match */ addr->addr_regex = NULL; if (ch == '/' || ch == '\\') { int flags = 0; struct buffer *b; addr->addr_type = ADDR_IS_REGEX; if (ch == '\\') ch = inchar(); if ( !(b = match_slash(ch, true)) ) bad_prog(_(UNTERM_ADDR_RE)); for(;;) { ch = in_nonblank(); switch(ch) { case 'I': /* GNU extension */ flags |= REG_ICASE; break; #ifdef REG_PERL case 'S': /* GNU extension */ if (extended_regexp_flags & REG_PERL) flags |= REG_DOTALL; break; case 'X': /* GNU extension */ if (extended_regexp_flags & REG_PERL) flags |= REG_EXTENDED; break; #endif case 'M': /* GNU extension */ flags |= REG_NEWLINE; break; default: savchar (ch); addr->addr_regex = compile_regex (b, flags, 0); free_buffer(b); return true; } } } else if (ISDIGIT(ch)) { addr->addr_number = in_integer(ch); addr->addr_type = ADDR_IS_NUM; ch = in_nonblank(); if (ch != '~') { savchar(ch); } else { countT step = in_integer(in_nonblank()); if (step > 0) { addr->addr_step = step; addr->addr_type = ADDR_IS_NUM_MOD; } } } else if (ch == '+' || ch == '~') { addr->addr_step = in_integer(in_nonblank()); if (addr->addr_step==0) ; /* default to ADDR_IS_NULL; forces matching to stop on next line */ else if (ch == '+') addr->addr_type = ADDR_IS_STEP; else addr->addr_type = ADDR_IS_STEP_MOD; } else if (ch == '$') { addr->addr_type = ADDR_IS_LAST; } else return false; return true; } /* Read a program (or a subprogram within `{' `}' pairs) in and store the compiled form in `*vector'. Return a pointer to the new vector. */ static struct vector *compile_program P_((struct vector *)); static struct vector * compile_program(vector) struct vector *vector; { struct sed_cmd *cur_cmd; struct buffer *b; int ch; if (!vector) { vector = MALLOC(1, struct vector); vector->v = NULL; vector->v_allocated = 0; vector->v_length = 0; obstack_init (&obs); } if (pending_text) read_text(NULL, '\n'); for (;;) { struct addr a; while ((ch=inchar()) == ';' || ISSPACE(ch)) ; if (ch == EOF) break; cur_cmd = next_cmd_entry(&vector); if (compile_address(&a, ch)) { if (a.addr_type == ADDR_IS_STEP || a.addr_type == ADDR_IS_STEP_MOD) bad_prog(_(BAD_STEP)); cur_cmd->a1 = MEMDUP(&a, 1, struct addr); ch = in_nonblank(); if (ch == ',') { if (!compile_address(&a, in_nonblank())) bad_prog(_(BAD_COMMA)); cur_cmd->a2 = MEMDUP(&a, 1, struct addr); ch = in_nonblank(); } if (cur_cmd->a1->addr_type == ADDR_IS_NUM && cur_cmd->a1->addr_number == 0 && (!cur_cmd->a2 || cur_cmd->a2->addr_type != ADDR_IS_REGEX)) bad_prog(_(INVALID_LINE_0)); } if (ch == '!') { cur_cmd->addr_bang = true; ch = in_nonblank(); if (ch == '!') bad_prog(_(BAD_BANG)); } /* Do not accept extended commands in --posix mode. Also, a few commands only accept one address in that mode. */ if (posixicity == POSIXLY_BASIC) switch (ch) { case 'v': case 'L': case 'Q': case 'T': case 'R': case 'W': bad_command(ch); case 'a': case 'i': case 'l': case '=': case 'r': if (cur_cmd->a2) bad_prog(_(ONE_ADDR)); } cur_cmd->cmd = ch; switch (ch) { case '#': if (cur_cmd->a1) bad_prog(_(NO_SHARP_ADDR)); ch = inchar(); if (ch=='n' && first_script && cur_input.line < 2) if ( (prog.base && prog.cur==2+prog.base) || (prog.file && !prog.base && 2==ftell(prog.file))) no_default_output = true; while (ch != EOF && ch != '\n') ch = inchar(); continue; /* restart the for (;;) loop */ case 'v': /* This is an extension. Programs needing GNU sed might start * with a `v' command so that other seds will stop. * We compare the version and ignore POSIXLY_CORRECT. */ { char *version = read_label (); char *compared_version; compared_version = (*version == '\0') ? "4.0" : version; if (strverscmp (compared_version, SED_FEATURE_VERSION) > 0) bad_prog(_(ANCIENT_VERSION)); free (version); posixicity = POSIXLY_EXTENDED; } continue; case '{': blocks = setup_label(blocks, vector->v_length, NULL, &cur_input); cur_cmd->addr_bang = !cur_cmd->addr_bang; break; case '}': if (!blocks) bad_prog(_(EXCESS_CLOSE_BRACE)); if (cur_cmd->a1) bad_prog(_(NO_CLOSE_BRACE_ADDR)); ch = in_nonblank(); if (ch == CLOSE_BRACE || ch == '#') savchar(ch); else if (ch != EOF && ch != '\n' && ch != ';') bad_prog(_(EXCESS_JUNK)); vector->v[blocks->v_index].x.jump_index = vector->v_length; blocks = release_label(blocks); /* done with this entry */ break; case 'e': ch = in_nonblank(); if (ch == EOF || ch == '\n') { cur_cmd->x.cmd_txt.text_length = 0; break; } else goto read_text_to_slash; case 'a': case 'i': case 'c': ch = in_nonblank(); read_text_to_slash: if (ch == EOF) bad_prog(_(EXPECTED_SLASH)); if (ch == '\\') ch = inchar(); else { savchar(ch); ch = '\n'; } read_text(&cur_cmd->x.cmd_txt, ch); break; case ':': if (cur_cmd->a1) bad_prog(_(NO_COLON_ADDR)); labels = setup_label(labels, vector->v_length, read_label(), NULL); break; case 'T': case 'b': case 't': jumps = setup_label(jumps, vector->v_length, read_label(), NULL); break; case 'Q': case 'q': if (cur_cmd->a2) bad_prog(_(ONE_ADDR)); /* Fall through */ case 'L': case 'l': ch = in_nonblank(); if (ISDIGIT(ch)) { cur_cmd->x.int_arg = in_integer(ch); ch = in_nonblank(); } else cur_cmd->x.int_arg = -1; if (ch == CLOSE_BRACE || ch == '#') savchar(ch); else if (ch != EOF && ch != '\n' && ch != ';') bad_prog(_(EXCESS_JUNK)); break; case '=': case 'd': case 'D': case 'g': case 'G': case 'h': case 'H': case 'n': case 'N': case 'p': case 'P': case 'x': ch = in_nonblank(); if (ch == CLOSE_BRACE || ch == '#') savchar(ch); else if (ch != EOF && ch != '\n' && ch != ';') bad_prog(_(EXCESS_JUNK)); break; case 'r': b = read_filename(); cur_cmd->x.fname = ck_strdup(get_buffer(b)); free_buffer(b); break; case 'R': cur_cmd->x.fp = get_openfile(&file_read, "r", false)->fp; break; case 'W': case 'w': cur_cmd->x.outf = get_openfile(&file_write, "w", true); break; case 's': { struct buffer *b2; int flags; int slash; slash = inchar(); if ( !(b = match_slash(slash, true)) ) bad_prog(_(UNTERM_S_CMD)); if ( !(b2 = match_slash(slash, false)) ) bad_prog(_(UNTERM_S_CMD)); cur_cmd->x.cmd_subst = OB_MALLOC(&obs, 1, struct subst); setup_replacement(cur_cmd->x.cmd_subst, get_buffer(b2), size_buffer(b2)); free_buffer(b2); flags = mark_subst_opts(cur_cmd->x.cmd_subst); cur_cmd->x.cmd_subst->regx = compile_regex(b, flags, cur_cmd->x.cmd_subst->max_id + 1); free_buffer(b); } break; case 'y': { size_t len, dest_len; int slash; struct buffer *b2; char *src_buf, *dest_buf; slash = inchar(); if ( !(b = match_slash(slash, true)) ) bad_prog(_(UNTERM_Y_CMD)); src_buf = get_buffer(b); len = normalize_text(src_buf, size_buffer (b), TEXT_BUFFER); if ( !(b2 = match_slash(slash, true)) ) bad_prog(_(UNTERM_Y_CMD)); dest_buf = get_buffer(b2); dest_len = normalize_text(dest_buf, size_buffer (b2), TEXT_BUFFER); if (mb_cur_max > 1) { int i, j, idx, src_char_num; size_t *src_lens = MALLOC(len, size_t); char **trans_pairs; size_t mbclen; mbstate_t cur_stat; /* Enumerate how many character the source buffer has. */ memset(&cur_stat, 0, sizeof(mbstate_t)); for (i = 0, j = 0; i < len;) { mbclen = MBRLEN (src_buf + i, len - i, &cur_stat); /* An invalid sequence, or a truncated multibyte character. We treat it as a singlebyte character. */ if (mbclen == (size_t) -1 || mbclen == (size_t) -2 || mbclen == 0) mbclen = 1; src_lens[j++] = mbclen; i += mbclen; } src_char_num = j; memset(&cur_stat, 0, sizeof(mbstate_t)); idx = 0; /* trans_pairs = {src(0), dest(0), src(1), dest(1), ..., NULL} src(i) : pointer to i-th source character. dest(i) : pointer to i-th destination character. NULL : terminator */ trans_pairs = MALLOC(2 * src_char_num + 1, char*); cur_cmd->x.translatemb = trans_pairs; for (i = 0; i < src_char_num; i++) { if (idx >= dest_len) bad_prog(_(Y_CMD_LEN)); /* Set the i-th source character. */ trans_pairs[2 * i] = MALLOC(src_lens[i] + 1, char); strncpy(trans_pairs[2 * i], src_buf, src_lens[i]); trans_pairs[2 * i][src_lens[i]] = '\0'; src_buf += src_lens[i]; /* Forward to next character. */ /* Fetch the i-th destination character. */ mbclen = MBRLEN (dest_buf + idx, dest_len - idx, &cur_stat); /* An invalid sequence, or a truncated multibyte character. We treat it as a singlebyte character. */ if (mbclen == (size_t) -1 || mbclen == (size_t) -2 || mbclen == 0) mbclen = 1; /* Set the i-th destination character. */ trans_pairs[2 * i + 1] = MALLOC(mbclen + 1, char); strncpy(trans_pairs[2 * i + 1], dest_buf + idx, mbclen); trans_pairs[2 * i + 1][mbclen] = '\0'; idx += mbclen; /* Forward to next character. */ } trans_pairs[2 * i] = NULL; if (idx != dest_len) bad_prog(_(Y_CMD_LEN)); } else { char *translate = OB_MALLOC(&obs, YMAP_LENGTH, char); unsigned char *ustring = CAST(unsigned char *)src_buf; if (len != dest_len) bad_prog(_(Y_CMD_LEN)); for (len = 0; len < YMAP_LENGTH; len++) translate[len] = len; while (dest_len--) translate[(unsigned char)*ustring++] = *dest_buf++; cur_cmd->x.translate = translate; } if ((ch = in_nonblank()) != EOF && ch != '\n' && ch != ';') bad_prog(_(EXCESS_JUNK)); free_buffer(b); free_buffer(b2); } break; case EOF: bad_prog(_(NO_COMMAND)); /*NOTREACHED*/ default: bad_command (ch); /*NOTREACHED*/ } /* this is buried down here so that "continue" statements will miss it */ ++vector->v_length; } return vector; } /* deal with \X escapes */ size_t normalize_text(buf, len, buftype) char *buf; size_t len; enum text_types buftype; { const char *bufend = buf + len; char *p = buf; char *q = buf; /* This variable prevents normalizing text within bracket subexpressions when conforming to POSIX. If 0, we are not within a bracket expression. If -1, we are within a bracket expression but are not within [.FOO.], [=FOO=], or [:FOO:]. Otherwise, this is the '.', '=', or ':' respectively within these three types of subexpressions. */ int bracket_state = 0; int mbclen; mbstate_t cur_stat; memset(&cur_stat, 0, sizeof(mbstate_t)); while (p < bufend) { int c; mbclen = MBRLEN (p, bufend - p, &cur_stat); if (mbclen != 1) { /* An invalid sequence, or a truncated multibyte character. We treat it as a singlebyte character. */ if (mbclen == (size_t) -1 || mbclen == (size_t) -2 || mbclen == 0) mbclen = 1; memmove (q, p, mbclen); q += mbclen; p += mbclen; continue; } if (*p == '\\' && p+1 < bufend && bracket_state == 0) switch ( (c = *++p) ) { #if defined __STDC__ && __STDC__-0 case 'a': *q++ = '\a'; p++; continue; #else /* Not STDC; we'll just assume ASCII */ case 'a': *q++ = '\007'; p++; continue; #endif /* case 'b': *q++ = '\b'; p++; continue; --- conflicts with \b RE */ case 'f': *q++ = '\f'; p++; continue; case '\n': /*fall through */ case 'n': *q++ = '\n'; p++; continue; case 'r': *q++ = '\r'; p++; continue; case 't': *q++ = '\t'; p++; continue; case 'v': *q++ = '\v'; p++; continue; case 'd': /* decimal byte */ p = convert_number(q, p+1, bufend, 10, 3, 'd'); q++; continue; case 'x': /* hexadecimal byte */ p = convert_number(q, p+1, bufend, 16, 2, 'x'); q++; continue; #ifdef REG_PERL case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': if ((extended_regexp_flags & REG_PERL) && p+1 < bufend && p[1] >= '0' && p[1] <= '9') { p = convert_number(q, p, bufend, 8, 3, *p); q++; } else { /* we just pass the \ up one level for interpretation */ if (buftype != TEXT_BUFFER) *q++ = '\\'; } continue; case 'o': /* octal byte */ if (!(extended_regexp_flags & REG_PERL)) { p = convert_number(q, p+1, bufend, 8, 3, 'o'); q++; } else { /* we just pass the \ up one level for interpretation */ if (buftype != TEXT_BUFFER) *q++ = '\\'; } continue; #else case 'o': /* octal byte */ p = convert_number(q, p+1, bufend, 8, 3, 'o'); q++; continue; #endif case 'c': if (++p < bufend) { *q++ = toupper(*p) ^ 0x40; p++; continue; } else { /* we just pass the \ up one level for interpretation */ if (buftype != TEXT_BUFFER) *q++ = '\\'; continue; } default: /* we just pass the \ up one level for interpretation */ if (buftype != TEXT_BUFFER) *q++ = '\\'; break; } else if (buftype == TEXT_REGEX && posixicity != POSIXLY_EXTENDED) switch (*p) { case '[': if (!bracket_state) bracket_state = -1; break; case ':': case '.': case '=': if (bracket_state == -1 && p[-1] == '[') bracket_state = *p; break; case ']': if (bracket_state == 0) ; else if (bracket_state == -1) bracket_state = 0; else if (p[-2] != bracket_state && p[-1] == bracket_state) bracket_state = -1; break; } *q++ = *p++; } return (size_t)(q - buf); } /* `str' is a string (from the command line) that contains a sed command. Compile the command, and add it to the end of `cur_program'. */ struct vector * compile_string(cur_program, str, len) struct vector *cur_program; char *str; size_t len; { static countT string_expr_count = 0; struct vector *ret; prog.file = NULL; prog.base = CAST(unsigned char *)str; prog.cur = prog.base; prog.end = prog.cur + len; cur_input.line = 0; cur_input.name = NULL; cur_input.string_expr_count = ++string_expr_count; ret = compile_program(cur_program); prog.base = NULL; prog.cur = NULL; prog.end = NULL; first_script = false; return ret; } /* `cmdfile' is the name of a file containing sed commands. Read them in and add them to the end of `cur_program'. */ struct vector * compile_file(cur_program, cmdfile) struct vector *cur_program; const char *cmdfile; { size_t len; struct vector *ret; prog.file = stdin; if (cmdfile[0] != '-' || cmdfile[1] != '\0') prog.file = ck_fopen(cmdfile, "rt", true); cur_input.line = 1; cur_input.name = cmdfile; cur_input.string_expr_count = 0; ret = compile_program(cur_program); if (prog.file != stdin) ck_fclose(prog.file); prog.file = NULL; first_script = false; return ret; } /* Make any checks which require the whole program to have been read. In particular: this backpatches the jump targets. Any cleanup which can be done after these checks is done here also. */ void check_final_program(program) struct vector *program; { struct sed_label *go; struct sed_label *lbl; /* do all "{"s have a corresponding "}"? */ if (blocks) { /* update info for error reporting: */ MEMCPY(&cur_input, &blocks->err_info, sizeof (cur_input)); bad_prog(_(EXCESS_OPEN_BRACE)); } /* was the final command an unterminated a/c/i command? */ if (pending_text) { old_text_buf->text_length = size_buffer(pending_text); old_text_buf->text = MEMDUP(get_buffer(pending_text), old_text_buf->text_length, char); free_buffer(pending_text); pending_text = NULL; } for (go = jumps; go; go = release_label(go)) { for (lbl = labels; lbl; lbl = lbl->next) if (strcmp(lbl->name, go->name) == 0) break; if (lbl) { program->v[go->v_index].x.jump_index = lbl->v_index; } else { if (*go->name) panic(_("can't find label for jump to `%s'"), go->name); program->v[go->v_index].x.jump_index = program->v_length; } } jumps = NULL; for (lbl = labels; lbl; lbl = release_label(lbl)) ; labels = NULL; /* There is no longer a need to track file names: */ { struct output *p; for (p=file_read; p; p=p->link) if (p->name) { FREE(p->name); p->name = NULL; } for (p=file_write; p; p=p->link) if (p->name) { FREE(p->name); p->name = NULL; } } } /* Rewind all resources which were allocated in this module. */ void rewind_read_files() { struct output *p; for (p=file_read; p; p=p->link) if (p->fp) rewind(p->fp); } /* Release all resources which were allocated in this module. */ void finish_program(program) struct vector *program; { /* close all files... */ { struct output *p, *q; for (p=file_read; p; p=q) { if (p->fp) ck_fclose(p->fp); q = p->link; #if 0 /* We use obstacks. */ FREE(p); #endif } for (p=file_write; p; p=q) { if (p->fp) ck_fclose(p->fp); q = p->link; #if 0 /* We use obstacks. */ FREE(p); #endif } file_read = file_write = NULL; } #ifdef DEBUG_LEAKS obstack_free (&obs, NULL); #endif /*DEBUG_LEAKS*/ } sed-3.62/sed/execute.c0000644000076600007660000013126610202627247011550 00000000000000 /* GNU SED, a batch stream editor. Copyright (C) 1989,90,91,92,93,94,95,98,99,2002,2003 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #undef EXPERIMENTAL_DASH_N_OPTIMIZATION /*don't use -- is very buggy*/ #define INITIAL_BUFFER_SIZE 50 #define FREAD_BUFFER_SIZE 8192 #include "sed.h" #include #include #include #ifndef errno extern int errno; #endif #ifdef HAVE_UNISTD_H # include #endif #ifdef __GNUC__ # if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__-0 >= 7) /* silence warning about unused parameter even for "gcc -W -Wunused" */ # define UNUSED __attribute__((unused)) # endif #endif #ifndef UNUSED # define UNUSED #endif #ifdef HAVE_STRINGS_H # include #else # include #endif /*HAVE_STRINGS_H*/ #ifdef HAVE_MEMORY_H # include #endif #ifndef HAVE_STRCHR # define strchr index # define strrchr rindex #endif #ifdef HAVE_STDLIB_H # include #endif #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif #ifdef HAVE_SYS_TYPES_H # include #endif #include /* Sed operates a line at a time. */ struct line { char *text; /* Pointer to line allocated by malloc. */ char *active; /* Pointer to non-consumed part of text. */ size_t length; /* Length of text (or active, if used). */ size_t alloc; /* Allocated space for active. */ bool chomped; /* Was a trailing newline dropped? */ #ifdef HAVE_MBRTOWC mbstate_t mbstate; #endif }; /* A queue of text to write out at the end of a cycle (filled by the "a", "r" and "R" commands.) */ struct append_queue { const char *fname; char *text; size_t textlen; struct append_queue *next; bool free; }; /* State information for the input stream. */ struct input { /* The list of yet-to-be-opened files. It is invalid for file_list to be NULL. When *file_list is NULL we are currently processing the last file. */ char **file_list; /* Count of files we failed to open. */ countT bad_count; /* Current input line number (over all files). */ countT line_number; /* True if we'll reset line numbers and addresses before starting to process the next (possibly the first) file. */ bool reset_at_next_file; /* Function to read one line. If FP is NULL, read_fn better not be one which uses fp; in particular, read_always_fail() is recommended. */ bool (*read_fn) P_((struct input *)); /* read one line */ char *out_file_name; const char *in_file_name; /* if NULL, none of the following are valid */ FILE *fp; bool no_buffering; }; /* Have we done any replacements lately? This is used by the `t' command. */ static bool replaced = false; /* The current output file (stdout if -i is not being used. */ static struct output output_file; /* The `current' input line. */ static struct line line; /* An input line used to accumulate the result of the s and e commands. */ static struct line s_accum; /* An input line that's been stored by later use by the program */ static struct line hold; /* The buffered input look-ahead. The only field that should be used outside of read_mem_line() or line_init() is buffer.length. */ static struct line buffer; static struct append_queue *append_head = NULL; static struct append_queue *append_tail = NULL; #ifdef BOOTSTRAP /* We can't be sure that the system we're boostrapping on has memchr(), and ../lib/memchr.c requires configuration knowledge about how many bits are in a `long'. This implementation is far from ideal, but it should get us up-and-limping well enough to run the configure script, which is all that matters. */ # ifdef memchr # undef memchr # endif # define memchr bootstrap_memchr static VOID *bootstrap_memchr P_((const VOID *s, int c, size_t n)); static VOID * bootstrap_memchr(s, c, n) const VOID *s; int c; size_t n; { char *p; for (p=(char *)s; n-- > 0; ++p) if (*p == c) return p; return CAST(VOID *)0; } #endif /*BOOTSTRAP*/ /* increase a struct line's length, making some attempt at keeping realloc() calls under control by padding for future growth. */ static void resize_line P_((struct line *, size_t)); static void resize_line(lb, len) struct line *lb; size_t len; { int inactive; inactive = lb->active - lb->text; /* If the inactive part has got to more than two thirds of the buffer, * remove it. */ if (inactive > lb->alloc * 2) { MEMMOVE(lb->text, lb->active, lb->length); lb->alloc += lb->active - lb->text; lb->active = lb->text; inactive = 0; if (lb->alloc > len) return; } lb->alloc *= 2; if (lb->alloc < len) lb->alloc = len; if (lb->alloc < INITIAL_BUFFER_SIZE) lb->alloc = INITIAL_BUFFER_SIZE; lb->text = REALLOC(lb->text, inactive + lb->alloc, char); lb->active = lb->text + inactive; } /* Append `length' bytes from `string' to the line `to'. */ static void str_append P_((struct line *, const char *, size_t)); static void str_append(to, string, length) struct line *to; const char *string; size_t length; { size_t new_length = to->length + length; if (to->alloc < new_length) resize_line(to, new_length); MEMCPY(to->active + to->length, string, length); to->length = new_length; #ifdef HAVE_MBRTOWC if (mb_cur_max == 1) return; while (length) { int n = MBRLEN (string, length, &to->mbstate); /* An invalid sequence is treated like a singlebyte character. */ if (n == -1) { memset (&to->mbstate, 0, sizeof (to->mbstate)); n = 1; } if (n > 0) length -= n; else break; } #endif } static void str_append_modified P_((struct line *, const char *, size_t, enum replacement_types)); static void str_append_modified(to, string, length, type) struct line *to; const char *string; size_t length; enum replacement_types type; { size_t old_length = to->length; char *start, *end; if (length == 0) return; #ifdef HAVE_MBRTOWC { mbstate_t from_stat; if (type == REPL_ASIS) { str_append(to, string, length); return; } if (to->alloc - to->length < length * mb_cur_max) resize_line(to, to->length + length * mb_cur_max); MEMCPY (&from_stat, &to->mbstate, sizeof(mbstate_t)); while (length) { wchar_t wc; int n = MBRTOWC (&wc, string, length, &from_stat); /* An invalid sequence is treated like a singlebyte character. */ if (n == -1) { memset (&to->mbstate, 0, sizeof (from_stat)); n = 1; } if (n > 0) string += n, length -= n; else { /* Incomplete sequence, copy it manually. */ str_append(to, string, length); return; } /* Convert the first character specially... */ if (type & (REPL_UPPERCASE_FIRST | REPL_LOWERCASE_FIRST)) { if (type & REPL_UPPERCASE_FIRST) wc = towupper(wc); else wc = towlower(wc); type &= ~(REPL_LOWERCASE_FIRST | REPL_UPPERCASE_FIRST); if (type == REPL_ASIS) { n = WCRTOMB (to->active + to->length, wc, &to->mbstate); to->length += n; str_append(to, string, length); return; } } else if (type & REPL_UPPERCASE) wc = towupper(wc); else wc = towlower(wc); /* Copy the new wide character to the end of the string. */ n = WCRTOMB (to->active + to->length, wc, &to->mbstate); to->length += n; if (n == -1) { fprintf (stderr, "Case conversion produced an invalid character!"); abort (); } } } #else str_append(to, string, length); start = to->active + old_length; end = start + length; /* Now do the required modifications. First \[lu]... */ if (type & REPL_UPPERCASE_FIRST) { *start = toupper(*start); start++; type &= ~REPL_UPPERCASE_FIRST; } else if (type & REPL_LOWERCASE_FIRST) { *start = tolower(*start); start++; type &= ~REPL_LOWERCASE_FIRST; } if (type == REPL_ASIS) return; /* ...and then \[LU] */ if (type == REPL_UPPERCASE) for (; start != end; start++) *start = toupper(*start); else for (; start != end; start++) *start = tolower(*start); #endif } /* initialize a "struct line" buffer */ static void line_init P_((struct line *, size_t initial_size)); static void line_init(buf, initial_size) struct line *buf; size_t initial_size; { buf->text = MALLOC(initial_size, char); buf->active = buf->text; buf->alloc = initial_size; buf->length = 0; buf->chomped = true; #ifdef HAVE_MBRTOWC memset (&buf->mbstate, 0, sizeof (buf->mbstate)); #endif } /* Copy the contents of the line `from' into the line `to'. This destroys the old contents of `to'. */ static void line_copy P_((struct line *from, struct line *to)); static void line_copy(from, to) struct line *from; struct line *to; { /* Remove the inactive portion in the destination buffer. */ to->alloc += to->active - to->text; if (to->alloc < from->length) { to->alloc *= 2; if (to->alloc < from->length) to->alloc = from->length; if (to->alloc < INITIAL_BUFFER_SIZE) to->alloc = INITIAL_BUFFER_SIZE; /* Use FREE()+MALLOC() instead of REALLOC() to avoid unnecessary copying of old text. */ FREE(to->text); to->text = MALLOC(to->alloc, char); } to->active = to->text; to->length = from->length; to->chomped = from->chomped; MEMCPY(to->active, from->active, from->length); #ifdef HAVE_MBRTOWC MEMCPY(&to->mbstate, &from->mbstate, sizeof (from->mbstate)); #endif } /* Append the contents of the line `from' to the line `to'. */ static void line_append P_((struct line *from, struct line *to)); static void line_append(from, to) struct line *from; struct line *to; { str_append(to, "\n", 1); str_append(to, from->active, from->length); to->chomped = from->chomped; #ifdef HAVE_MBRTOWC MEMCPY (&to->mbstate, &from->mbstate, sizeof (from->mbstate)); #endif } /* Exchange the contents of two "struct line" buffers. */ static void line_exchange P_((struct line *, struct line *)); static void line_exchange(a, b) struct line *a; struct line *b; { struct line t; MEMCPY(&t, a, sizeof(struct line)); MEMCPY( a, b, sizeof(struct line)); MEMCPY( b, &t, sizeof(struct line)); } /* dummy function to simplify read_pattern_space() */ static bool read_always_fail P_((struct input *)); static bool read_always_fail(input) struct input *input UNUSED; { return false; } static bool read_file_line P_((struct input *)); static bool read_file_line(input) struct input *input; { static char *b; static size_t blen; long result = ck_getline (&b, &blen, input->fp); if (result <= 0) return false; /* Remove the trailing new-line that is left by getline. */ if (b[result - 1] == '\n') --result; else line.chomped = false; str_append(&line, b, result); return true; } static inline void output_missing_newline P_((struct output *)); static inline void output_missing_newline(outf) struct output *outf; { if (outf->missing_newline) { ck_fwrite("\n", 1, 1, outf->fp); outf->missing_newline = false; } } static inline void flush_output P_((FILE *)); static inline void flush_output(fp) FILE *fp; { if (fp != stdout || unbuffered_output) ck_fflush(fp); } static void output_line P_((const char *, size_t, bool, struct output *)); static void output_line(text, length, nl, outf) const char *text; size_t length; bool nl; struct output *outf; { output_missing_newline(outf); if (length) ck_fwrite(text, 1, length, outf->fp); if (nl) ck_fwrite("\n", 1, 1, outf->fp); else outf->missing_newline = true; flush_output(outf->fp); } static struct append_queue *next_append_slot P_((void)); static struct append_queue * next_append_slot() { struct append_queue *n = MALLOC(1, struct append_queue); n->fname = NULL; n->text = NULL; n->textlen = 0; n->next = NULL; n->free = false; if (append_tail) append_tail->next = n; else append_head = n; return append_tail = n; } static void release_append_queue P_((void)); static void release_append_queue() { struct append_queue *p, *q; for (p=append_head; p; p=q) { if (p->free) FREE(p->text); q = p->next; FREE(p); } append_head = append_tail = NULL; } static void dump_append_queue P_((void)); static void dump_append_queue() { struct append_queue *p; output_missing_newline(&output_file); for (p=append_head; p; p=p->next) { if (p->text) ck_fwrite(p->text, 1, p->textlen, output_file.fp); if (p->fname) { char buf[FREAD_BUFFER_SIZE]; size_t cnt; FILE *fp; /* "If _fname_ does not exist or cannot be read, it shall be treated as if it were an empty file, causing no error condition." IEEE Std 1003.2-1992 So, don't fail. */ fp = ck_fopen(p->fname, "r", false); if (fp) { while ((cnt = ck_fread(buf, 1, sizeof buf, fp)) > 0) ck_fwrite(buf, 1, cnt, output_file.fp); ck_fclose(fp); } } } flush_output(output_file.fp); release_append_queue(); } /* Compute the name of the backup file for in-place editing */ static char *get_backup_file_name P_((const char *)); static char * get_backup_file_name(name) const char *name; { char *old_asterisk, *asterisk, *backup, *p; int name_length = strlen(name), backup_length = strlen(in_place_extension); /* Compute the length of the backup file */ for (asterisk = in_place_extension - 1, old_asterisk = asterisk + 1; asterisk = strchr(old_asterisk, '*'); old_asterisk = asterisk + 1) backup_length += name_length - 1; p = backup = xmalloc(backup_length + 1); /* Each iteration gobbles up to an asterisk */ for (asterisk = in_place_extension - 1, old_asterisk = asterisk + 1; asterisk = strchr(old_asterisk, '*'); old_asterisk = asterisk + 1) { MEMCPY (p, old_asterisk, asterisk - old_asterisk); p += asterisk - old_asterisk; strcpy (p, name); p += name_length; } /* Tack on what's after the last asterisk */ strcpy (p, old_asterisk); return backup; } /* Initialize a struct input for the named file. */ static void open_next_file P_((const char *name, struct input *)); static void open_next_file(name, input) const char *name; struct input *input; { buffer.length = 0; if (name[0] == '-' && name[1] == '\0' && !in_place_extension) { clearerr(stdin); /* clear any stale EOF indication */ input->fp = stdin; } else if ( ! (input->fp = ck_fopen(name, "r", false)) ) { const char *ptr = strerror(errno); fprintf(stderr, _("%s: can't read %s: %s\n"), myname, name, ptr); input->read_fn = read_always_fail; /* a redundancy */ ++input->bad_count; return; } input->read_fn = read_file_line; if (in_place_extension) { int output_fd; char *tmpdir = ck_strdup(name), *p; struct stat st; /* get the base name */ if (p = strrchr(tmpdir, '/')) *(p + 1) = 0; else strcpy(tmpdir, "."); input->in_file_name = name; if (isatty (fileno (input->fp))) panic(_("couldn't edit %s: is a terminal"), input->in_file_name); fstat (fileno (input->fp), &st); if (!S_ISREG (st.st_mode)) panic(_("couldn't edit %s: not a regular file"), input->in_file_name); output_file.fp = ck_mkstemp (&input->out_file_name, tmpdir, "sed"); output_file.missing_newline = false; free (tmpdir); if (!output_file.fp) panic(_("couldn't open temporary file %s: %s"), input->out_file_name, strerror(errno)); output_fd = fileno (output_file.fp); #ifdef HAVE_FCHMOD fchmod (output_fd, st.st_mode); #endif #ifdef HAVE_FCHOWN if (fchown (output_fd, st.st_uid, st.st_gid) == -1) fchown (output_fd, -1, st.st_gid); #endif } else output_file.fp = stdout; } /* Clean up an input stream that we are done with. */ static void closedown P_((struct input *)); static void closedown(input) struct input *input; { input->read_fn = read_always_fail; if (!input->fp) return; if (input->fp != stdin) /* stdin can be reused on tty and tape devices */ ck_fclose(input->fp); if (in_place_extension && output_file.fp != NULL) { ck_fclose (output_file.fp); if (strcmp(in_place_extension, "*") != 0) { char *backup_file_name = get_backup_file_name(input->in_file_name); ck_rename (input->in_file_name, backup_file_name, input->out_file_name); free (backup_file_name); } ck_rename (input->out_file_name, input->in_file_name, input->out_file_name); free (input->out_file_name); } input->fp = NULL; } /* Reset range commands so that they are marked as non-matching */ static void reset_addresses P_((struct vector *)); static void reset_addresses(vec) struct vector *vec; { struct sed_cmd *cur_cmd; int n; for (cur_cmd = vec->v, n = vec->v_length; n--; cur_cmd++) if (cur_cmd->a1 && (cur_cmd->a1->addr_type == ADDR_IS_NUM || cur_cmd->a1->addr_type == ADDR_IS_NUM_MOD) && cur_cmd->a1->addr_number == 0) cur_cmd->range_state = RANGE_ACTIVE; else cur_cmd->range_state = RANGE_INACTIVE; } /* Read in the next line of input, and store it in the pattern space. Return zero if there is nothing left to input. */ static bool read_pattern_space P_((struct input *, struct vector *, bool)); static bool read_pattern_space(input, the_program, append) struct input *input; struct vector *the_program; bool append; { if (append_head) /* redundant test to optimize for common case */ dump_append_queue(); replaced = false; if (!append) line.length = 0; line.chomped = true; /* default, until proved otherwise */ while ( ! (*input->read_fn)(input) ) { closedown(input); if (!*input->file_list) return false; if (input->reset_at_next_file) { input->line_number = 0; reset_addresses (the_program); rewind_read_files (); /* If doing in-place editing, we will never append the new-line to this file; but if the output goes to stdout, we might still have to output the missing new-line. */ if (in_place_extension) output_file.missing_newline = false; input->reset_at_next_file = separate_files; } open_next_file (*input->file_list++, input); } ++input->line_number; return true; } static bool last_file_with_data_p P_((struct input *)); static bool last_file_with_data_p(input) struct input *input; { for (;;) { int ch; closedown(input); if (!*input->file_list) return true; open_next_file(*input->file_list++, input); if (input->fp) { if ((ch = getc(input->fp)) != EOF) { ungetc(ch, input->fp); return false; } } } } /* Determine if we match the `$' address. */ static bool test_eof P_((struct input *)); static bool test_eof(input) struct input *input; { int ch; if (buffer.length) return false; if (!input->fp) return separate_files || last_file_with_data_p(input); if (feof(input->fp)) return separate_files || last_file_with_data_p(input); if ((ch = getc(input->fp)) == EOF) return separate_files || last_file_with_data_p(input); ungetc(ch, input->fp); return false; } /* Return non-zero if the current line matches the address pointed to by `addr'. */ static bool match_an_address_p P_((struct addr *, struct input *)); static bool match_an_address_p(addr, input) struct addr *addr; struct input *input; { switch (addr->addr_type) { case ADDR_IS_NULL: return true; case ADDR_IS_REGEX: return match_regex(addr->addr_regex, line.active, line.length, 0, NULL, 0); case ADDR_IS_NUM_MOD: return (input->line_number >= addr->addr_number && ((input->line_number - addr->addr_number) % addr->addr_step) == 0); case ADDR_IS_STEP: case ADDR_IS_STEP_MOD: /* reminder: these are only meaningful for a2 addresses */ /* a2->addr_number needs to be recomputed each time a1 address matches for the step and step_mod types */ return (addr->addr_number <= input->line_number); case ADDR_IS_LAST: return test_eof(input); /* ADDR_IS_NUM is handled in match_address_p. */ case ADDR_IS_NUM: default: panic("INTERNAL ERROR: bad address type"); } /*NOTREACHED*/ return false; } /* return non-zero if current address is valid for cmd */ static bool match_address_p P_((struct sed_cmd *, struct input *)); static bool match_address_p(cmd, input) struct sed_cmd *cmd; struct input *input; { if (!cmd->a1) return true; if (cmd->range_state != RANGE_ACTIVE) { /* Find if we are going to activate a range. Handle ADDR_IS_NUM specially: it represent an "absolute" state, it should not be computed like regexes. */ if (cmd->a1->addr_type == ADDR_IS_NUM) { if (!cmd->a2) return (input->line_number == cmd->a1->addr_number); if (cmd->range_state == RANGE_CLOSED || input->line_number < cmd->a1->addr_number) return false; } else { if (!cmd->a2) return match_an_address_p(cmd->a1, input); if (!match_an_address_p(cmd->a1, input)) return false; } /* Ok, start a new range. */ cmd->range_state = RANGE_ACTIVE; switch (cmd->a2->addr_type) { case ADDR_IS_REGEX: /* Always include at least two lines. */ return true; case ADDR_IS_NUM: /* Same handling as below, but always include at least one line. */ if (input->line_number >= cmd->a2->addr_number) cmd->range_state = RANGE_CLOSED; return true; case ADDR_IS_STEP: cmd->a2->addr_number = input->line_number + cmd->a2->addr_step; return true; case ADDR_IS_STEP_MOD: cmd->a2->addr_number = input->line_number + cmd->a2->addr_step - (input->line_number%cmd->a2->addr_step); return true; default: break; } } /* cmd->range_state == RANGE_ACTIVE. Check if the range is ending; also handle ADDR_IS_NUM specially in this case. */ if (cmd->a2->addr_type == ADDR_IS_NUM) { /* If the second address is a line number, and if we got past that line, fail to match (it can happen when you jump over such addresses with `b' and `t'. Use RANGE_CLOSED so that the range is not re-enabled anymore. */ if (input->line_number >= cmd->a2->addr_number) cmd->range_state = RANGE_CLOSED; return (input->line_number <= cmd->a2->addr_number); } /* Other addresses are treated as usual. */ if (match_an_address_p(cmd->a2, input)) cmd->range_state = RANGE_CLOSED; return true; } static void do_list P_((int line_len)); static void do_list(line_len) int line_len; { unsigned char *p = CAST(unsigned char *)line.active; countT len = line.length; countT width = 0; char obuf[180]; /* just in case we encounter a 512-bit char (;-) */ char *o; size_t olen; FILE *fp = output_file.fp; output_missing_newline(&output_file); for (; len--; ++p) { o = obuf; /* Some locales define 8-bit characters as printable. This makes the testsuite fail at 8to7.sed because the `l' command in fact will not convert the 8-bit characters. */ #if defined isascii || defined HAVE_ISASCII if (isascii(*p) && ISPRINT(*p)) { #else if (ISPRINT(*p)) { #endif *o++ = *p; if (*p == '\\') *o++ = '\\'; } else { *o++ = '\\'; switch (*p) { #if defined __STDC__ && __STDC__-0 case '\a': *o++ = 'a'; break; #else /* Not STDC; we'll just assume ASCII */ case 007: *o++ = 'a'; break; #endif case '\b': *o++ = 'b'; break; case '\f': *o++ = 'f'; break; case '\n': *o++ = 'n'; break; case '\r': *o++ = 'r'; break; case '\t': *o++ = 't'; break; case '\v': *o++ = 'v'; break; default: sprintf(o, "%03o", *p); o += strlen(o); break; } } olen = o - obuf; if (width+olen >= line_len && line_len > 0) { ck_fwrite("\\\n", 1, 2, fp); width = 0; } ck_fwrite(obuf, 1, olen, fp); width += olen; } ck_fwrite("$\n", 1, 2, fp); flush_output (fp); } static enum replacement_types append_replacement P_((struct line *, struct replacement *, struct re_registers *, enum replacement_types)); static enum replacement_types append_replacement (buf, p, regs, repl_mod) struct line *buf; struct replacement *p; struct re_registers *regs; enum replacement_types repl_mod; { for (; p; p=p->next) { int i = p->subst_id; enum replacement_types curr_type; /* Apply a \[lu] modifier that was given earlier, but which we have not had yet the occasion to apply. But don't do it if this replacement has a modifier of its own. */ curr_type = (p->repl_type & REPL_MODIFIERS) ? p->repl_type : p->repl_type | repl_mod; repl_mod = 0; if (p->prefix_length) { str_append_modified(buf, p->prefix, p->prefix_length, curr_type); curr_type &= ~REPL_MODIFIERS; } if (0 <= i) if (regs->end[i] == regs->start[i] && p->repl_type & REPL_MODIFIERS) /* Save this modifier, we shall apply it later. e.g. in s/()([a-z])/\u\1\2/ the \u modifier is applied to \2, not \1 */ repl_mod = curr_type & REPL_MODIFIERS; else str_append_modified(buf, line.active + regs->start[i], CAST(size_t)(regs->end[i] - regs->start[i]), curr_type); } return repl_mod; } static void do_subst P_((struct subst *)); static void do_subst(sub) struct subst *sub; { size_t start = 0; /* where to start scan for (next) match in LINE */ size_t last_end = 0; /* where did the last successful match end in LINE */ countT count = 0; /* number of matches found */ bool again = true; static struct re_registers regs; if (s_accum.alloc == 0) line_init(&s_accum, INITIAL_BUFFER_SIZE); s_accum.length = 0; /* The first part of the loop optimizes s/xxx// when xxx is at the start, and s/xxx$// */ if (!match_regex(sub->regx, line.active, line.length, start, ®s, sub->max_id + 1)) return; if (!sub->replacement && sub->numb <= 1) if (regs.start[0] == 0 && !sub->global) { /* We found a match, set the `replaced' flag. */ replaced = true; line.active += regs.end[0]; line.length -= regs.end[0]; line.alloc -= regs.end[0]; goto post_subst; } else if (regs.end[0] == line.length) { /* We found a match, set the `replaced' flag. */ replaced = true; line.length = regs.start[0]; goto post_subst; } do { enum replacement_types repl_mod = 0; size_t offset = regs.start[0]; size_t matched = regs.end[0] - regs.start[0]; /* Copy stuff to the left of this match into the output string. */ if (start < offset) str_append(&s_accum, line.active + start, offset - start); /* If we're counting up to the Nth match, are we there yet? And even if we are there, there is another case we have to skip: are we matching an empty string immediately following another match? This latter case avoids that baaaac, when passed through s,a*,x,g, gives `xbxxcx' instead of xbxcx. This behavior is unacceptable because it is not consistently applied (for example, `baaaa' gives `xbx', not `xbxx'). */ if ((matched > 0 || count == 0 || offset > last_end) && ++count >= sub->numb) { /* We found a match, set the `replaced' flag. */ replaced = true; /* Now expand the replacement string into the output string. */ repl_mod = append_replacement (&s_accum, sub->replacement, ®s, repl_mod); again = sub->global; } else { /* The match was not replaced. Copy the text until its end; if it was vacuous, skip over one character and add that character to the output. */ if (matched == 0) { if (start < line.length) matched = 1; else break; } str_append(&s_accum, line.active + offset, matched); } /* Start after the match. last_end is the real end of the matched substring, excluding characters that were skipped in case the RE matched the empty string. */ start = offset + matched; last_end = regs.end[0]; } while (again && start <= line.length && match_regex(sub->regx, line.active, line.length, start, ®s, sub->max_id + 1)); /* Copy stuff to the right of the last match into the output string. */ if (start < line.length) str_append(&s_accum, line.active + start, line.length-start); s_accum.chomped = line.chomped; /* Exchange line and s_accum. This can be much cheaper than copying s_accum.active into line.text (for huge lines). */ line_exchange(&line, &s_accum); /* Finish up. */ if (count < sub->numb) return; post_subst: if (sub->print & 1) output_line(line.active, line.length, line.chomped, &output_file); if (sub->eval) { #ifdef HAVE_POPEN FILE *pipe; s_accum.length = 0; str_append (&line, "", 1); pipe = popen(line.active, "r"); if (pipe != NULL) { while (!feof (pipe)) { char buf[4096]; int n = fread (buf, sizeof(char), 4096, pipe); if (n > 0) str_append(&s_accum, buf, n); } pclose (pipe); line_exchange(&line, &s_accum); if (line.length && line.active[line.length - 1] == '\n') line.length--; } else panic(_("error in subprocess")); #else panic(_("option `e' not supported")); #endif } if (sub->print & 2) output_line(line.active, line.length, line.chomped, &output_file); if (sub->outf) output_line(line.active, line.length, line.chomped, sub->outf); } #ifdef EXPERIMENTAL_DASH_N_OPTIMIZATION /* Used to attempt a simple-minded optimization. */ static countT branches; static countT count_branches P_((struct vector *)); static countT count_branches(program) struct vector *program; { struct sed_cmd *cur_cmd = program->v; countT isn_cnt = program->v_length; countT cnt = 0; while (isn_cnt-- > 0) { switch (cur_cmd->cmd) { case 'b': case 't': case 'T': case '{': ++cnt; } } return cnt; } static struct sed_cmd *shrink_program P_((struct vector *, struct sed_cmd *)); static struct sed_cmd * shrink_program(vec, cur_cmd) struct vector *vec; struct sed_cmd *cur_cmd; { struct sed_cmd *v = vec->v; struct sed_cmd *last_cmd = v + vec->v_length; struct sed_cmd *p; countT cmd_cnt; for (p=v; p < cur_cmd; ++p) if (p->cmd != '#') MEMCPY(v++, p, sizeof *v); cmd_cnt = v - vec->v; for (; p < last_cmd; ++p) if (p->cmd != '#') MEMCPY(v++, p, sizeof *v); vec->v_length = v - vec->v; return (0 < vec->v_length) ? (vec->v + cmd_cnt) : CAST(struct sed_cmd *)0; } #endif /*EXPERIMENTAL_DASH_N_OPTIMIZATION*/ /* Execute the program `vec' on the current input line. Return exit status if caller should quit, -1 otherwise. */ static int execute_program P_((struct vector *, struct input *)); static int execute_program(vec, input) struct vector *vec; struct input *input; { struct sed_cmd *cur_cmd; struct sed_cmd *end_cmd; cur_cmd = vec->v; end_cmd = vec->v + vec->v_length; while (cur_cmd < end_cmd) { if (match_address_p(cur_cmd, input) != cur_cmd->addr_bang) { switch (cur_cmd->cmd) { case 'a': { struct append_queue *aq = next_append_slot(); aq->text = cur_cmd->x.cmd_txt.text; aq->textlen = cur_cmd->x.cmd_txt.text_length; } break; case '{': case 'b': cur_cmd = vec->v + cur_cmd->x.jump_index; continue; case '}': case '#': case ':': /* Executing labels and block-ends are easy. */ break; case 'c': if (cur_cmd->range_state != RANGE_ACTIVE) output_line(cur_cmd->x.cmd_txt.text, cur_cmd->x.cmd_txt.text_length - 1, true, &output_file); /* POSIX.2 is silent about c starting a new cycle, but it seems to be expected (and make sense). */ /* Fall Through */ case 'd': return -1; case 'D': { char *p = memchr(line.active, '\n', line.length); if (!p) return -1; ++p; line.alloc -= p - line.active; line.length -= p - line.active; line.active += p - line.active; /* reset to start next cycle without reading a new line: */ cur_cmd = vec->v; continue; } case 'e': { #ifdef HAVE_POPEN FILE *pipe; int cmd_length = cur_cmd->x.cmd_txt.text_length; if (s_accum.alloc == 0) line_init(&s_accum, INITIAL_BUFFER_SIZE); s_accum.length = 0; if (!cmd_length) { str_append (&line, "", 1); pipe = popen(line.active, "r"); } else { cur_cmd->x.cmd_txt.text[cmd_length - 1] = 0; pipe = popen(cur_cmd->x.cmd_txt.text, "r"); output_missing_newline(&output_file); } if (pipe != NULL) { while (!feof (pipe)) { char buf[4096]; int n = fread (buf, sizeof(char), 4096, pipe); if (n > 0) if (!cmd_length) str_append(&s_accum, buf, n); else ck_fwrite(buf, 1, n, output_file.fp); } pclose (pipe); if (!cmd_length) { /* Store into pattern space for plain `e' commands */ if (s_accum.length && s_accum.active[s_accum.length - 1] == '\n') s_accum.length--; /* Exchange line and s_accum. This can be much cheaper than copying s_accum.active into line.text (for huge lines). */ line_exchange(&line, &s_accum); } else flush_output(output_file.fp); } else panic(_("error in subprocess")); #else panic(_("`e' command not supported")); #endif break; } case 'g': line_copy(&hold, &line); break; case 'G': line_append(&hold, &line); break; case 'h': line_copy(&line, &hold); break; case 'H': line_append(&line, &hold); break; case 'i': output_line(cur_cmd->x.cmd_txt.text, cur_cmd->x.cmd_txt.text_length - 1, true, &output_file); break; case 'l': do_list(cur_cmd->x.int_arg == -1 ? lcmd_out_line_len : cur_cmd->x.int_arg); break; case 'L': output_missing_newline(&output_file); fmt(line.active, line.active + line.length, cur_cmd->x.int_arg == -1 ? lcmd_out_line_len : cur_cmd->x.int_arg, output_file.fp); flush_output(output_file.fp); break; case 'n': if (!no_default_output) output_line(line.active, line.length, line.chomped, &output_file); if (test_eof(input) || !read_pattern_space(input, vec, false)) return -1; break; case 'N': str_append(&line, "\n", 1); if (test_eof(input) || !read_pattern_space(input, vec, true)) { line.length--; if (posixicity == POSIXLY_EXTENDED && !no_default_output) output_line(line.active, line.length, line.chomped, &output_file); return -1; } break; case 'p': output_line(line.active, line.length, line.chomped, &output_file); break; case 'P': { char *p = memchr(line.active, '\n', line.length); output_line(line.active, p ? p - line.active : line.length, p ? true : line.chomped, &output_file); } break; case 'q': if (!no_default_output) output_line(line.active, line.length, line.chomped, &output_file); dump_append_queue(); case 'Q': return cur_cmd->x.int_arg == -1 ? 0 : cur_cmd->x.int_arg; case 'r': if (cur_cmd->x.fname) { struct append_queue *aq = next_append_slot(); aq->fname = cur_cmd->x.fname; } break; case 'R': if (cur_cmd->x.fp && !feof (cur_cmd->x.fp)) { struct append_queue *aq; size_t buflen; char *text = NULL; int result; result = ck_getline (&text, &buflen, cur_cmd->x.fp); if (result != EOF) { aq = next_append_slot(); aq->free = true; aq->text = text; aq->textlen = result; } } break; case 's': do_subst(cur_cmd->x.cmd_subst); break; case 't': if (replaced) { replaced = false; cur_cmd = vec->v + cur_cmd->x.jump_index; continue; } break; case 'T': if (!replaced) { cur_cmd = vec->v + cur_cmd->x.jump_index; continue; } else replaced = false; break; case 'w': if (cur_cmd->x.fp) output_line(line.active, line.length, line.chomped, cur_cmd->x.outf); break; case 'W': if (cur_cmd->x.fp) { char *p = memchr(line.active, '\n', line.length); output_line(line.active, p ? p - line.active : line.length, p ? true : line.chomped, cur_cmd->x.outf); } break; case 'x': line_exchange(&line, &hold); break; case 'y': { #ifdef HAVE_MBRTOWC if (mb_cur_max > 1) { int idx, prev_idx; /* index in the input line. */ char **trans; mbstate_t mbstate; memset(&mbstate, 0, sizeof(mbstate_t)); for (idx = 0; idx < line.length;) { int mbclen, i; mbclen = MBRLEN (line.active + idx, line.length - idx, &mbstate); /* An invalid sequence, or a truncated multibyte character. We treat it as a singlebyte character. */ if (mbclen == (size_t) -1 || mbclen == (size_t) -2 || mbclen == 0) mbclen = 1; trans = cur_cmd->x.translatemb; /* `i' indicate i-th translate pair. */ for (i = 0; trans[2*i] != NULL; i++) { if (strncmp(line.active + idx, trans[2*i], mbclen) == 0) { bool move_remain_buffer = false; int trans_len = strlen(trans[2*i+1]); if (mbclen < trans_len) { int new_len; new_len = line.length + 1 + trans_len - mbclen; /* We must extend the line buffer. */ if (line.alloc < new_len) { /* And we must resize the buffer. */ resize_line(&line, new_len); } move_remain_buffer = true; } else if (mbclen > trans_len) { /* We must truncate the line buffer. */ move_remain_buffer = true; } prev_idx = idx; if (move_remain_buffer) { int move_len, move_offset; char *move_from, *move_to; /* Move the remaining with \0. */ move_from = line.active + idx + mbclen; move_to = line.active + idx + trans_len; move_len = line.length + 1 - idx - mbclen; move_offset = trans_len - mbclen; memmove(move_to, move_from, move_len); line.length += move_offset; idx += move_offset; } strncpy(line.active + prev_idx, trans[2*i+1], trans_len); break; } } idx += mbclen; } } else #endif /* HAVE_MBRTOWC */ { unsigned char *p, *e; p = CAST(unsigned char *)line.active; for (e=p+line.length; px.translate[*p]; } } break; case '=': output_missing_newline(&output_file); fprintf(output_file.fp, "%lu\n", CAST(unsigned long)input->line_number); flush_output(output_file.fp); break; default: panic("INTERNAL ERROR: Bad cmd %c", cur_cmd->cmd); } } #ifdef EXPERIMENTAL_DASH_N_OPTIMIZATION /* If our top-level program consists solely of commands with ADDR_IS_NUM addresses then once we past the last mentioned line we should be able to quit if no_default_output is true, or otherwise quickly copy input to output. Now whether this optimization is a win or not depends on how cheaply we can implement this for the cases where it doesn't help, as compared against how much time is saved. One semantic difference (which I think is an improvement) is that *this* version will terminate after printing line two in the script "yes | sed -n 2p". Don't use this when in-place editing is active, because line numbers restart each time then. */ else if (!separate_files) { if (cur_cmd->a1->addr_type == ADDR_IS_NUM && (cur_cmd->a2 ? cur_cmd->range_state == RANGE_CLOSED : cur_cmd->a1->addr_number < input->line_number)) { /* Skip this address next time */ cur_cmd->addr_bang = !cur_cmd->addr_bang; cur_cmd->a1->addr_type = ADDR_IS_NULL; if (cur_cmd->a2) cur_cmd->a2->addr_type = ADDR_IS_NULL; /* can we make an optimization? */ if (cur_cmd->addr_bang) { if (cur_cmd->cmd == 'b' || cur_cmd->cmd == 't' || cur_cmd->cmd == 'T' || cur_cmd->cmd == '}') branches--; cur_cmd->cmd = '#'; /* replace with no-op */ if (branches == 0) cur_cmd = shrink_program(vec, cur_cmd); if (!cur_cmd && no_default_output) return 0; end_cmd = vec->v + vec->v_length; if (!cur_cmd) cur_cmd = end_cmd; continue; } } } #endif /*EXPERIMENTAL_DASH_N_OPTIMIZATION*/ /* this is buried down here so that a "continue" statement can skip it */ ++cur_cmd; } if (!no_default_output) output_line(line.active, line.length, line.chomped, &output_file); return -1; } /* Apply the compiled script to all the named files. */ int process_files(the_program, argv) struct vector *the_program; char **argv; { static char dash[] = "-"; static char *stdin_argv[2] = { dash, NULL }; struct input input; int status; line_init(&line, INITIAL_BUFFER_SIZE); line_init(&hold, 0); line_init(&buffer, 0); #ifdef EXPERIMENTAL_DASH_N_OPTIMIZATION branches = count_branches(the_program); #endif /*EXPERIMENTAL_DASH_N_OPTIMIZATION*/ input.file_list = stdin_argv; input.reset_at_next_file = true; if (argv && *argv) input.file_list = argv; input.bad_count = 0; input.line_number = 0; input.read_fn = read_always_fail; input.fp = NULL; status = EXIT_SUCCESS; while (read_pattern_space(&input, the_program, false)) { status = execute_program(the_program, &input); if (status == -1) status = EXIT_SUCCESS; else break; } closedown(&input); #ifdef DEBUG_LEAKS /* We're about to exit, so these free()s are redundant. But if we're running under a memory-leak detecting implementation of malloc(), we want to explicitly deallocate in order to avoid extraneous noise from the allocator. */ release_append_queue(); FREE(buffer.text); FREE(hold.text); FREE(line.text); FREE(s_accum.text); #endif /*DEBUG_LEAKS*/ if (input.bad_count) status = 2; return status; } sed-3.62/sed/fmt.c0000644000076600007660000003557610143133571010677 00000000000000/* `L' command implementation for GNU sed, based on GNU fmt 1.22. Copyright (C) 1994, 1995, 1996, 2002, 2003 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* GNU fmt was written by Ross Paterson . */ #include "sed.h" #include #include #include #if HAVE_LIMITS_H # include #endif #ifndef UINT_MAX # define UINT_MAX ((unsigned int) ~(unsigned int) 0) #endif #ifndef INT_MAX # define INT_MAX ((int) (UINT_MAX >> 1)) #endif /* The following parameters represent the program's idea of what is "best". Adjust to taste, subject to the caveats given. */ /* Prefer lines to be LEEWAY % shorter than the maximum width, giving room for optimization. */ #define LEEWAY 7 /* Costs and bonuses are expressed as the equivalent departure from the optimal line length, multiplied by 10. e.g. assigning something a cost of 50 means that it is as bad as a line 5 characters too short or too long. The definition of SHORT_COST(n) should not be changed. However, EQUIV(n) may need tuning. */ typedef long COST; #define MAXCOST (~(((unsigned long) 1) << (8 * sizeof (COST) -1))) #define SQR(n) ((n) * (n)) #define EQUIV(n) SQR ((COST) (n)) /* Cost of a filled line n chars longer or shorter than best_width. */ #define SHORT_COST(n) EQUIV ((n) * 10) /* Cost of the difference between adjacent filled lines. */ #define RAGGED_COST(n) (SHORT_COST (n) / 2) /* Basic cost per line. */ #define LINE_COST EQUIV (70) /* Cost of breaking a line after the first word of a sentence, where the length of the word is N. */ #define WIDOW_COST(n) (EQUIV (200) / ((n) + 2)) /* Cost of breaking a line before the last word of a sentence, where the length of the word is N. */ #define ORPHAN_COST(n) (EQUIV (150) / ((n) + 2)) /* Bonus for breaking a line at the end of a sentence. */ #define SENTENCE_BONUS EQUIV (50) /* Cost of breaking a line after a period not marking end of a sentence. With the definition of sentence we are using (borrowed from emacs, see get_line()) such a break would then look like a sentence break. Hence we assign a very high cost -- it should be avoided unless things are really bad. */ #define NOBREAK_COST EQUIV (600) /* Bonus for breaking a line before open parenthesis. */ #define PAREN_BONUS EQUIV (40) /* Bonus for breaking a line after other punctuation. */ #define PUNCT_BONUS EQUIV(40) /* Credit for breaking a long paragraph one line later. */ #define LINE_CREDIT EQUIV(3) /* Size of paragraph buffer in words. Longer paragraphs are handled neatly (cf. flush_paragraph()), so there's little to gain by making these larger. */ #define MAXWORDS 1000 #define GETC() (parabuf == end_of_parabuf ? EOF : *parabuf++) /* Extra ctype(3)-style macros. */ #define isopen(c) (strchr ("([`'\"", (c)) != NULL) #define isclose(c) (strchr (")]'\"", (c)) != NULL) #define isperiod(c) (strchr (".?!", (c)) != NULL) /* Size of a tab stop, for expansion on input and re-introduction on output. */ #define TABWIDTH 8 /* Word descriptor structure. */ typedef struct Word WORD; struct Word { /* Static attributes determined during input. */ const char *text; /* the text of the word */ short length; /* length of this word */ short space; /* the size of the following space */ unsigned paren:1; /* starts with open paren */ unsigned period:1; /* ends in [.?!])* */ unsigned punct:1; /* ends in punctuation */ unsigned final:1; /* end of sentence */ /* The remaining fields are computed during the optimization. */ short line_length; /* length of the best line starting here */ COST best_cost; /* cost of best paragraph starting here */ WORD *next_break; /* break which achieves best_cost */ }; /* Forward declarations. */ static bool get_paragraph P_ ((void)); static int get_line P_ ((int c)); static int get_space P_ ((int c)); static int copy_rest P_ ((int c)); static bool same_para P_ ((int c)); static void flush_paragraph P_ ((void)); static void fmt_paragraph P_ ((void)); static void check_punctuation P_ ((WORD *w)); static COST base_cost P_ ((WORD *this)); static COST line_cost P_ ((WORD *next, int len)); static void put_paragraph P_ ((WORD *finish)); static void put_line P_ ((WORD *w, int indent)); static void put_word P_ ((WORD *w)); static void put_space P_ ((int space)); /* Option values. */ /* User-supplied maximum line width (default WIDTH). The only output lines longer than this will each comprise a single word. */ static int max_width; /* Space for the paragraph text. */ static const char *parabuf; /* End of space for the paragraph text. */ static const char *end_of_parabuf; /* The file on which we output */ static FILE *outfile; /* Values derived from the option values. */ /* The preferred width of text lines, set to LEEWAY % less than max_width. */ static int best_width; /* Dynamic variables. */ /* Start column of the character most recently read from the input file. */ static int in_column; /* Start column of the next character to be written to stdout. */ static int out_column; /* The words of a paragraph -- longer paragraphs are handled neatly (cf. flush_paragraph()). */ static WORD words[MAXWORDS]; /* A pointer into the above word array, indicating the first position after the last complete word. Sometimes it will point at an incomplete word. */ static WORD *word_limit; /* Indentation of the first line of the current paragraph. */ static int first_indent; /* Indentation of other lines of the current paragraph */ static int other_indent; /* The last character read from the input file. */ static int next_char; /* If nonzero, the length of the last line output in the current paragraph, used to charge for raggedness at the split point for long paragraphs chosen by fmt_paragraph(). */ static int last_line_length; /* read file F and send formatted output to stdout. */ void fmt (const char *line, const char *line_end, int max_length, FILE *output_file) { parabuf = line; end_of_parabuf = line_end; outfile = output_file; max_width = max_length; best_width = max_width * (201 - 2 * LEEWAY) / 200; in_column = 0; other_indent = 0; next_char = GETC(); while (get_paragraph ()) { fmt_paragraph (); put_paragraph (word_limit); } } /* Read a paragraph from input file F. A paragraph consists of a maximal number of non-blank (excluding any prefix) lines with the same indent. Return false if end-of-file was encountered before the start of a paragraph, else true. */ static bool get_paragraph () { register int c; last_line_length = 0; c = next_char; /* Scan (and copy) blank lines, and lines not introduced by the prefix. */ while (c == '\n' || c == EOF) { c = copy_rest (c); if (c == EOF) { next_char = EOF; return false; } putc ('\n', outfile); c = GETC(); } /* Got a suitable first line for a paragraph. */ first_indent = in_column; word_limit = words; c = get_line (c); /* Read rest of paragraph. */ other_indent = in_column; while (same_para (c) && in_column == other_indent) c = get_line (c); (word_limit - 1)->period = (word_limit - 1)->final = true; next_char = c; return true; } /* Copy to the output a blank line. In the latter, C is \n or EOF. Return the character (\n or EOF) ending the line. */ static int copy_rest (register int c) { out_column = 0; while (c != '\n' && c != EOF) { putc (c, outfile); c = GETC(); } return c; } /* Return true if a line whose first non-blank character after the prefix (if any) is C could belong to the current paragraph, otherwise false. */ static bool same_para (register int c) { return (c != '\n' && c != EOF); } /* Read a line from the input data given first non-blank character C after the prefix, and the following indent, and break it into words. A word is a maximal non-empty string of non-white characters. A word ending in [.?!]["')\]]* and followed by end-of-line or at least two spaces ends a sentence, as in emacs. Return the first non-blank character of the next line. */ static int get_line (register int c) { int start; register WORD *end_of_word; end_of_word = &words[MAXWORDS - 2]; do { /* for each word in a line */ /* Scan word. */ word_limit->text = parabuf - 1; do c = GETC(); while (c != EOF && !ISSPACE (c)); word_limit->length = parabuf - word_limit->text - (c != EOF); in_column += word_limit->length; check_punctuation (word_limit); /* Scan inter-word space. */ start = in_column; c = get_space (c); word_limit->space = in_column - start; word_limit->final = (c == EOF || (word_limit->period && (c == '\n' || word_limit->space > 1))); if (c == '\n' || c == EOF) word_limit->space = word_limit->final ? 2 : 1; if (word_limit == end_of_word) flush_paragraph (); word_limit++; if (c == EOF) { in_column = first_indent; return EOF; } } while (c != '\n'); in_column = 0; c = GETC(); return get_space (c); } /* Read blank characters from the input data, starting with C, and keeping in_column up-to-date. Return first non-blank character. */ static int get_space (register int c) { for (;;) { if (c == ' ') in_column++; else if (c == '\t') in_column = (in_column / TABWIDTH + 1) * TABWIDTH; else return c; c = GETC(); } } /* Set extra fields in word W describing any attached punctuation. */ static void check_punctuation (register WORD *w) { register const char *start, *finish; start = w->text; finish = start + (w->length - 1); w->paren = isopen (*start); w->punct = ISPUNCT (*finish); while (isclose (*finish) && finish > start) finish--; w->period = isperiod (*finish); } /* Flush part of the paragraph to make room. This function is called on hitting the limit on the number of words or characters. */ static void flush_paragraph (void) { WORD *split_point; register WORD *w; COST best_break; /* - format what you have so far as a paragraph, - find a low-cost line break near the end, - output to there, - make that the start of the paragraph. */ fmt_paragraph (); /* Choose a good split point. */ split_point = word_limit; best_break = MAXCOST; for (w = words->next_break; w != word_limit; w = w->next_break) { if (w->best_cost - w->next_break->best_cost < best_break) { split_point = w; best_break = w->best_cost - w->next_break->best_cost; } if (best_break <= MAXCOST - LINE_CREDIT) best_break += LINE_CREDIT; } put_paragraph (split_point); /* Copy words from split_point down to word -- we use memmove because the source and target may overlap. */ memmove ((char *) words, (char *) split_point, (word_limit - split_point + 1) * sizeof (WORD)); word_limit -= split_point - words; } /* Compute the optimal formatting for the whole paragraph by computing and remembering the optimal formatting for each suffix from the empty one to the whole paragraph. */ static void fmt_paragraph (void) { register WORD *start, *w; register int len; register COST wcost, best; int saved_length; word_limit->best_cost = 0; saved_length = word_limit->length; word_limit->length = max_width; /* sentinel */ for (start = word_limit - 1; start >= words; start--) { best = MAXCOST; len = start == words ? first_indent : other_indent; /* At least one word, however long, in the line. */ w = start; len += w->length; do { w++; /* Consider breaking before w. */ wcost = line_cost (w, len) + w->best_cost; if (start == words && last_line_length > 0) wcost += RAGGED_COST (len - last_line_length); if (wcost < best) { best = wcost; start->next_break = w; start->line_length = len; } len += (w - 1)->space + w->length; /* w > start >= words */ } while (len < max_width); start->best_cost = best + base_cost (start); } word_limit->length = saved_length; } /* Return the constant component of the cost of breaking before the word THIS. */ static COST base_cost (register WORD *this) { register COST cost; cost = LINE_COST; if (this > words) { if ((this - 1)->period) { if ((this - 1)->final) cost -= SENTENCE_BONUS; else cost += NOBREAK_COST; } else if ((this - 1)->punct) cost -= PUNCT_BONUS; else if (this > words + 1 && (this - 2)->final) cost += WIDOW_COST ((this - 1)->length); } if (this->paren) cost -= PAREN_BONUS; else if (this->final) cost += ORPHAN_COST (this->length); return cost; } /* Return the component of the cost of breaking before word NEXT that depends on LEN, the length of the line beginning there. */ static COST line_cost (register WORD *next, register int len) { register int n; register COST cost; if (next == word_limit) return 0; n = best_width - len; cost = SHORT_COST (n); if (next->next_break != word_limit) { n = len - next->line_length; cost += RAGGED_COST (n); } return cost; } /* Output to stdout a paragraph from word up to (but not including) FINISH, which must be in the next_break chain from word. */ static void put_paragraph (register WORD *finish) { register WORD *w; put_line (words, first_indent); for (w = words->next_break; w != finish; w = w->next_break) put_line (w, other_indent); } /* Output to stdout the line beginning with word W, beginning in column INDENT, including the prefix (if any). */ static void put_line (register WORD *w, int indent) { register WORD *endline; out_column = 0; put_space (indent); endline = w->next_break - 1; for (; w != endline; w++) { put_word (w); put_space (w->space); } put_word (w); last_line_length = out_column; putc ('\n', outfile); } /* Output to stdout the word W. */ static void put_word (register WORD *w) { register const char *s; register int n; s = w->text; for (n = w->length; n != 0; n--) putc (*s++, outfile); out_column += w->length; } /* Output to stdout SPACE spaces, or equivalent tabs. */ static void put_space (int space) { out_column += space; while (space--) putc (' ', outfile); } sed-3.62/sed/mbcs.c0000644000076600007660000000277510143133571011030 00000000000000/* GNU SED, a batch stream editor. Copyright (C) 2003 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "sed.h" #include int mb_cur_max; #ifdef HAVE_MBRTOWC /* Add a byte to the multibyte character represented by the state CUR_STAT, and answer its length if a character is completed, or -2 if it is yet to be completed. */ int brlen (ch, cur_stat) int ch; mbstate_t *cur_stat; { char c = ch; /* If we use the generic brlen, then MBRLEN == mbrlen. */ int result = mbrtowc(NULL, &c, 1, cur_stat); /* An invalid sequence is treated like a singlebyte character. */ if (result == -1) { memset (cur_stat, 0, sizeof (mbstate_t)); return 1; } return result; } #endif void initialize_mbcs () { #ifdef HAVE_MBRTOWC mb_cur_max = MB_CUR_MAX; #else mb_cur_max = 1; #endif } sed-3.62/sed/regexp.c0000644000076600007660000001453310202627242011370 00000000000000/* GNU SED, a batch stream editor. Copyright (C) 1999, 2002, 2003, 2004, 2005 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "sed.h" #include #include #ifdef HAVE_STDLIB_H # include #endif #ifdef gettext_noop # define N_(String) gettext_noop(String) #else # define N_(String) (String) #endif extern bool use_extended_syntax_p; static const char errors[] = "no previous regular expression\0" "cannot specify modifiers on empty regexp"; #define NO_REGEX (errors) #define BAD_MODIF (NO_REGEX + sizeof(N_("no previous regular expression"))) #define END_ERRORS (BAD_MODIF + sizeof(N_("cannot specify modifiers on empty regexp"))) static void compile_regex_1 (new_regex, needed_sub) struct regex *new_regex; int needed_sub; { #ifdef REG_PERL int errcode; errcode = regncomp(&new_regex->pattern, new_regex->re, new_regex->sz, (needed_sub ? 0 : REG_NOSUB) | new_regex->flags | extended_regexp_flags); if (errcode) { char errorbuf[200]; regerror(errcode, NULL, errorbuf, 200); bad_prog(gettext(errorbuf)); } #else const char *error; int syntax = ((extended_regexp_flags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC) & ~RE_UNMATCHED_RIGHT_PAREN_ORD; syntax |= RE_NO_POSIX_BACKTRACKING; #ifdef RE_ICASE syntax |= (new_regex->flags & REG_ICASE) ? RE_ICASE : 0; #endif #ifdef RE_NO_SUB syntax |= needed_sub ? 0 : RE_NO_SUB; #endif new_regex->pattern.fastmap = malloc (1 << (sizeof (char) * 8)); /* If REG_NEWLINE is set, newlines are treated differently. */ if (new_regex->flags & REG_NEWLINE) { /* REG_NEWLINE implies neither . nor [^...] match newline. */ syntax &= ~RE_DOT_NEWLINE; syntax |= RE_HAT_LISTS_NOT_NEWLINE; } re_set_syntax (syntax); error = re_compile_pattern (new_regex->re, new_regex->sz, &new_regex->pattern); new_regex->pattern.newline_anchor = (new_regex->flags & REG_NEWLINE) != 0; new_regex->pattern.translate = NULL; #ifndef RE_ICASE if (new_regex->flags & REG_ICASE) { static char translate[1 << (sizeof(char) * 8)]; int i; for (i = 0; i < sizeof(translate) / sizeof(char); i++) translate[i] = tolower (i); new_regex->pattern.translate = translate; } #endif if (error) bad_prog(error); #endif /* Just to be sure, I mark this as not POSIXLY_CORRECT behavior */ if (needed_sub && new_regex->pattern.re_nsub < needed_sub - 1 && posixicity == POSIXLY_EXTENDED) { char buf[200]; sprintf(buf, _("invalid reference \\%d on `s' command's RHS"), needed_sub - 1); bad_prog(buf); } } struct regex * compile_regex(b, flags, needed_sub) struct buffer *b; int flags; int needed_sub; { struct regex *new_regex; size_t re_len; /* // matches the last RE */ if (size_buffer(b) == 0) { if (flags > 0) bad_prog(_(BAD_MODIF)); return NULL; } re_len = size_buffer(b); new_regex = ck_malloc(sizeof (struct regex) + re_len - 1); new_regex->flags = flags; memcpy (new_regex->re, get_buffer(b), re_len); #ifdef REG_PERL new_regex->sz = re_len; #else /* GNU regex does not process \t & co. */ new_regex->sz = normalize_text(new_regex->re, re_len, TEXT_REGEX); #endif compile_regex_1 (new_regex, needed_sub); return new_regex; } #ifdef REG_PERL static void copy_regs (regs, pmatch, nregs) struct re_registers *regs; regmatch_t *pmatch; int nregs; { int i; int need_regs = nregs + 1; /* We need one extra element beyond `num_regs' for the `-1' marker GNU code uses. */ /* Have the register data arrays been allocated? */ if (!regs->start) { /* No. So allocate them with malloc. */ regs->start = MALLOC (need_regs, regoff_t); regs->end = MALLOC (need_regs, regoff_t); regs->num_regs = need_regs; } else if (need_regs > regs->num_regs) { /* Yes. We also need more elements than were already allocated, so reallocate them. */ regs->start = REALLOC (regs->start, need_regs, regoff_t); regs->end = REALLOC (regs->end, need_regs, regoff_t); regs->num_regs = need_regs; } /* Copy the regs. */ for (i = 0; i < nregs; ++i) { regs->start[i] = pmatch[i].rm_so; regs->end[i] = pmatch[i].rm_eo; } for ( ; i < regs->num_regs; ++i) regs->start[i] = regs->end[i] = -1; } #endif int match_regex(regex, buf, buflen, buf_start_offset, regarray, regsize) struct regex *regex; char *buf; size_t buflen; size_t buf_start_offset; struct re_registers *regarray; int regsize; { int ret; static struct regex *regex_last; #ifdef REG_PERL regmatch_t rm[10], *regmatch = rm; if (regsize > 10) regmatch = (regmatch_t *) alloca (sizeof (regmatch_t) * regsize); #endif /* printf ("Matching from %d/%d\n", buf_start_offset, buflen); */ /* Keep track of the last regexp matched. */ if (!regex) { regex = regex_last; if (!regex_last) bad_prog(_(NO_REGEX)); } else regex_last = regex; #ifdef REG_PERL regmatch[0].rm_so = CAST(int)buf_start_offset; regmatch[0].rm_eo = CAST(int)buflen; ret = regexec (®ex->pattern, buf, regsize, regmatch, REG_STARTEND); if (regsize) copy_regs (regarray, regmatch, regsize); return (ret == 0); #else if (regex->pattern.no_sub && regsize) compile_regex_1 (regex, regsize); regex->pattern.regs_allocated = REGS_REALLOCATE; ret = re_search (®ex->pattern, buf, buflen, buf_start_offset, buflen - buf_start_offset, regsize ? regarray : NULL); return (ret > -1); #endif } #ifdef DEBUG_LEAKS void release_regex(regex) struct regex *regex; { regfree(®ex->pattern); FREE(regex); } #endif /*DEBUG_LEAKS*/ sed-3.62/sed/sed.c0000644000076600007660000001740510144674127010663 00000000000000#define COPYRIGHT_NOTICE "Copyright (C) 2003 Free Software Foundation, Inc." #define BUG_ADDRESS "bonzini@gnu.org" /* GNU SED, a batch stream editor. Copyright (C) 1989,90,91,92,93,94,95,98,99,2002,2003 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "sed.h" #include #ifdef HAVE_STRINGS_H # include #else # include #endif /*HAVE_STRINGS_H*/ #ifdef HAVE_MEMORY_H # include #endif #ifndef HAVE_STRCHR # define strchr index # define strrchr rindex #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #include "getopt.h" #ifndef BOOTSTRAP #ifndef HAVE_STDLIB_H extern char *getenv P_((const char *)); #endif #endif #ifndef HAVE_STRTOUL # define ATOI(x) atoi(x) #else # define ATOI(x) strtoul(x, NULL, 0) #endif int extended_regexp_flags = 0; /* If set, fflush(stdout) on every line output. */ bool unbuffered_output = false; /* If set, don't write out the line unless explicitly told to */ bool no_default_output = false; /* If set, reset line counts on every new file. */ bool separate_files = false; /* How do we edit files in-place? (we don't if NULL) */ char *in_place_extension = NULL; /* Do we need to be pedantically POSIX compliant? */ enum posixicity_types posixicity; /* How long should the `l' command's output line be? */ countT lcmd_out_line_len = 70; /* The complete compiled SED program that we are going to run: */ static struct vector *the_program = NULL; static void usage P_((int)); static void usage(status) int status; { FILE *out = status ? stderr : stdout; #ifdef REG_PERL #define PERL_HELP _(" -R, --regexp-perl\n use Perl 5's regular expressions syntax in the script.\n") #else #define PERL_HELP "" #endif fprintf(out, _("\ Usage: %s [OPTION]... {script-only-if-no-other-script} [input-file]...\n\ \n"), myname); fprintf(out, _(" -n, --quiet, --silent\n\ suppress automatic printing of pattern space\n")); fprintf(out, _(" -e script, --expression=script\n\ add the script to the commands to be executed\n")); fprintf(out, _(" -f script-file, --file=script-file\n\ add the contents of script-file to the commands to be executed\n")); fprintf(out, _(" -i[SUFFIX], --in-place[=SUFFIX]\n\ edit files in place (makes backup if extension supplied)\n")); fprintf(out, _(" -l N, --line-length=N\n\ specify the desired line-wrap length for the `l' command\n")); fprintf(out, _(" --posix\n\ disable all GNU extensions.\n")); fprintf(out, _(" -r, --regexp-extended\n\ use extended regular expressions in the script.\n")); fprintf(out, PERL_HELP); fprintf(out, _(" -s, --separate\n\ consider files as separate rather than as a single continuous\n\ long stream.\n")); fprintf(out, _(" -u, --unbuffered\n\ load minimal amounts of data from the input files and flush\n\ the output buffers more often\n")); fprintf(out, _(" --help display this help and exit\n")); fprintf(out, _(" --version output version information and exit\n")); fprintf(out, _("\n\ If no -e, --expression, -f, or --file option is given, then the first\n\ non-option argument is taken as the sed script to interpret. All\n\ remaining arguments are names of input files; if no input files are\n\ specified, then the standard input is read.\n\ \n")); fprintf(out, _("E-mail bug reports to: %s .\n\ Be sure to include the word ``%s'' somewhere in the ``Subject:'' field.\n"), BUG_ADDRESS, PACKAGE); ck_fclose (NULL); exit (status); } int main(argc, argv) int argc; char **argv; { #ifdef REG_PERL #define SHORTOPTS "snrRue:f:l:i::V:" #else #define SHORTOPTS "snrue:f:l:i::V:" #endif static struct option longopts[] = { {"regexp-extended", 0, NULL, 'r'}, #ifdef REG_PERL {"regexp-perl", 0, NULL, 'R'}, #endif {"expression", 1, NULL, 'e'}, {"file", 1, NULL, 'f'}, {"in-place", 2, NULL, 'i'}, {"line-length", 1, NULL, 'l'}, {"quiet", 0, NULL, 'n'}, {"posix", 0, NULL, 'p'}, {"silent", 0, NULL, 'n'}, {"separate", 0, NULL, 's'}, {"unbuffered", 0, NULL, 'u'}, {"version", 0, NULL, 'v'}, {"help", 0, NULL, 'h'}, {NULL, 0, NULL, 0} }; int opt; int return_code; const char *cols = getenv("COLS"); initialize_main (&argc, &argv); #if HAVE_SETLOCALE /* Set locale according to user's wishes. */ setlocale (LC_ALL, ""); #endif initialize_mbcs (); #if ENABLE_NLS /* Tell program which translations to use and where to find. */ bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); #endif if (getenv("POSIXLY_CORRECT") != NULL) posixicity = POSIXLY_CORRECT; else posixicity = POSIXLY_EXTENDED; /* If environment variable `COLS' is set, use its value for the baseline setting of `lcmd_out_line_len'. The "-1" is to avoid gratuitous auto-line-wrap on ttys. */ if (cols) { countT t = ATOI(cols); if (t > 1) lcmd_out_line_len = t-1; } myname = *argv; while ((opt = getopt_long(argc, argv, SHORTOPTS, longopts, NULL)) != EOF) { switch (opt) { case 'n': no_default_output = true; break; case 'e': the_program = compile_string(the_program, optarg, strlen(optarg)); break; case 'f': the_program = compile_file(the_program, optarg); break; case 'i': separate_files = true; if (optarg == NULL) /* use no backups */ in_place_extension = ck_strdup ("*"); else if (strchr(optarg, '*') != NULL) in_place_extension = ck_strdup(optarg); else { in_place_extension = MALLOC (strlen(optarg) + 2, char); in_place_extension[0] = '*'; strcpy (in_place_extension + 1, optarg); } break; case 'l': lcmd_out_line_len = ATOI(optarg); break; case 'p': posixicity = POSIXLY_BASIC; break; case 'r': if (extended_regexp_flags) usage(4); extended_regexp_flags = REG_EXTENDED; break; #ifdef REG_PERL case 'R': if (extended_regexp_flags) usage(4); extended_regexp_flags = REG_PERL; break; #endif case 's': separate_files = true; break; case 'u': unbuffered_output = true; break; case 'v': #ifdef REG_PERL fprintf(stdout, _("super-sed version %s\n"), VERSION); fprintf(stdout, _("based on GNU sed version %s\n\n"), SED_FEATURE_VERSION); #else fprintf(stdout, _("GNU sed version %s\n"), VERSION); #endif fprintf(stdout, _("%s\n\ This is free software; see the source for copying conditions. There is NO\n\ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n\ to the extent permitted by law.\n\ "), COPYRIGHT_NOTICE); ck_fclose (NULL); exit (0); case 'h': usage(0); default: usage(4); } } if (!the_program) { if (optind < argc) { char *arg = argv[optind++]; the_program = compile_string(the_program, arg, strlen(arg)); } else usage(4); } check_final_program(the_program); return_code = process_files(the_program, argv+optind); finish_program(the_program); ck_fclose(NULL); return return_code; } sed-3.62/sed/sed.h0000644000076600007660000001607210163557763010676 00000000000000/* GNU SED, a batch stream editor. Copyright (C) 1989,90,91,92,93,94,95,98,99,2002,2003 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "basicdefs.h" #include "regexp.h" #ifndef BOOTSTRAP #include #endif #include "utils.h" /* Struct vector is used to describe a compiled sed program. */ struct vector { struct sed_cmd *v; /* a dynamically allocated array */ size_t v_allocated; /* ... number slots allocated */ size_t v_length; /* ... number of slots in use */ }; /* This structure tracks files used by sed so that they may all be closed cleanly at normal program termination. A flag is kept that tells if a missing newline was encountered, so that it is added on the next line and the two lines are not concatenated. */ struct output { char *name; bool missing_newline; FILE *fp; struct output *link; }; struct text_buf { char *text; size_t text_length; }; struct regex { regex_t pattern; int flags; size_t sz; char re[1]; }; enum replacement_types { REPL_ASIS = 0, REPL_UPPERCASE = 1, REPL_LOWERCASE = 2, REPL_UPPERCASE_FIRST = 4, REPL_LOWERCASE_FIRST = 8, REPL_MODIFIERS = REPL_UPPERCASE_FIRST | REPL_LOWERCASE_FIRST, /* These are given to aid in debugging */ REPL_UPPERCASE_UPPERCASE = REPL_UPPERCASE_FIRST | REPL_UPPERCASE, REPL_UPPERCASE_LOWERCASE = REPL_UPPERCASE_FIRST | REPL_LOWERCASE, REPL_LOWERCASE_UPPERCASE = REPL_LOWERCASE_FIRST | REPL_UPPERCASE, REPL_LOWERCASE_LOWERCASE = REPL_LOWERCASE_FIRST | REPL_LOWERCASE }; enum text_types { TEXT_BUFFER, TEXT_REPLACEMENT, TEXT_REGEX }; enum posixicity_types { POSIXLY_EXTENDED, /* with GNU extensions */ POSIXLY_CORRECT, /* with POSIX-compatible GNU extensions */ POSIXLY_BASIC /* pedantically POSIX */ }; enum addr_state { RANGE_INACTIVE, /* never been active */ RANGE_ACTIVE, /* between first and second address */ RANGE_CLOSED /* like RANGE_INACTIVE, but range has ended once */ }; enum addr_types { ADDR_IS_NULL, /* null address */ ADDR_IS_REGEX, /* a.addr_regex is valid */ ADDR_IS_NUM, /* a.addr_number is valid */ ADDR_IS_NUM_MOD, /* a.addr_number is valid, addr_step is modulo */ ADDR_IS_STEP, /* address is +N (only valid for addr2) */ ADDR_IS_STEP_MOD, /* address is ~N (only valid for addr2) */ ADDR_IS_LAST /* address is $ */ }; struct addr { enum addr_types addr_type; countT addr_number; countT addr_step; struct regex *addr_regex; }; struct replacement { char *prefix; size_t prefix_length; int subst_id; enum replacement_types repl_type; struct replacement *next; }; struct subst { struct regex *regx; struct replacement *replacement; countT numb; /* if >0, only substitute for match number "numb" */ struct output *outf; /* 'w' option given */ unsigned global : 1; /* 'g' option given */ unsigned print : 2; /* 'p' option given (before/after eval) */ unsigned eval : 1; /* 'e' option given */ unsigned max_id : 4; /* maximum backreference on the RHS */ }; #ifdef REG_PERL /* 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; }; #endif struct sed_cmd { struct addr *a1; /* save space: usually is NULL */ struct addr *a2; /* See description the enum, above. */ enum addr_state range_state; /* Non-zero if command is to be applied to non-matches. */ char addr_bang; /* The actual command character. */ char cmd; /* auxiliary data for various commands */ union { /* This structure is used for a, i, and c commands. */ struct text_buf cmd_txt; /* This is used for the l, q and Q commands. */ int int_arg; /* This is used for the {}, b, and t commands. */ countT jump_index; /* This is used for the r command. */ char *fname; /* This is used for the hairy s command. */ struct subst *cmd_subst; /* This is used for the w command. */ struct output *outf; /* This is used for the R command. */ FILE *fp; /* This is used for the y command. */ unsigned char *translate; char **translatemb; } x; }; void bad_prog P_((const char *why)); size_t normalize_text P_((char *text, size_t len, enum text_types buftype)); struct vector *compile_string P_((struct vector *, char *str, size_t len)); struct vector *compile_file P_((struct vector *, const char *cmdfile)); void check_final_program P_((struct vector *)); void rewind_read_files P_((void)); void finish_program P_((struct vector *)); struct regex *compile_regex P_((struct buffer *b, int flags, int needed_sub)); int match_regex P_((struct regex *regex, char *buf, size_t buflen, size_t buf_start_offset, struct re_registers *regarray, int regsize)); #ifdef DEBUG_LEAKS void release_regex P_((struct regex *)); #endif int process_files P_((struct vector *, char **argv)); int main P_((int, char **)); extern void fmt P_ ((const char *line, const char *line_end, int max_length, FILE *output_file)); extern int extended_regexp_flags; /* If set, fflush(stdout) on every line output. */ extern bool unbuffered_output; /* If set, don't write out the line unless explicitly told to. */ extern bool no_default_output; /* If set, reset line counts on every new file. */ extern bool separate_files; /* Do we need to be pedantically POSIX compliant? */ extern enum posixicity_types posixicity; /* How long should the `l' command's output line be? */ extern countT lcmd_out_line_len; /* How do we edit files in-place? (we don't if NULL) */ extern char *in_place_extension; /* Should we use EREs? */ extern bool use_extended_syntax_p; /* Declarations for multibyte character sets. */ extern int mb_cur_max; #ifdef HAVE_MBRTOWC #ifdef HAVE_BTOWC #define MBRTOWC(pwc, s, n, ps) \ (mb_cur_max == 1 ? \ (*(pwc) = btowc (*(unsigned char *) (s)), 1) : \ mbrtowc ((pwc), (s), (n), (ps))) #define WCRTOMB(s, wc, ps) \ (mb_cur_max == 1 ? \ (*(s) = wctob ((wint_t) (wc)), 1) : \ wcrtomb ((s), (wc), (ps))) #else #define MBRTOWC(pwc, s, n, ps) \ mbrtowc ((pwc), (s), (n), (ps)) #define WCRTOMB(s, wc, ps) \ wcrtomb ((s), (wc), (ps)) #endif #define MBRLEN(s, n, ps) \ (mb_cur_max == 1 ? 1 : mbrtowc (NULL, s, n, ps)) #define BRLEN(ch, ps) \ (mb_cur_max == 1 ? 1 : brlen (ch, ps)) #else #define MBRLEN(s, n, ps) 1 #define BRLEN(ch, ps) 1 #endif extern int brlen P_ ((int ch, mbstate_t *ps)); sed-3.62/testsuite/0000777000076600007660000000000010202633252011264 500000000000000sed-3.62/testsuite/0range.good0000644000076600007660000000000410143133572013224 00000000000000yes sed-3.62/testsuite/0range.inp0000644000076600007660000000002010143133572013060 000000000000001 2 3 4 aaa yes sed-3.62/testsuite/0range.sed0000644000076600007660000000001110143133572013045 000000000000000,/aaa/d sed-3.62/testsuite/8bit.good0000644000076600007660000000026010143133572012722 00000000000000䯤â¤è ¤ß䯻ý¤Á ·¡¶ú¤â¤è ¤ß·¡¶ú»ý¤Á ¤³¤ÎµÖ¤Ë ºÚŦ¤Þ¤¹»ù ²È´Ö¤«¤Ê ¹ð¤é¤µ¤Í ¤½¤é¤ß¤Ä ÆüËܤιñ¤Ï ¤ª¤·¤ã¤Ê¤Ù¤Æ ¤ï¤ì¤³¤½µï¤ì ¤·¤­¤Ê¤Ù¤Æ ¤ï¤ì¤³¤½ ºÂ¤» ¤ï¤Ë¤³¤½¤Ï ¹ð¤é¤á ²È¤ò¤â̾¤ò¤â sed-3.62/testsuite/8bit.inp0000644000076600007660000000026010143133572012560 00000000000000䯤â¤è ¤ß䯻ý¤Á ·¡¶ú¤â¤è ¤ß·¡¶ú»ý¤Á ¤³¤ÎµÖ¤Ë ºÚŦ¤Þ¤¹»ù ²È´Ö¤«¤Ê ¹ð¤é¤µ¤Í ¤½¤é¤ß¤Ä ÂçϤιñ¤Ï ¤ª¤·¤ã¤Ê¤Ù¤Æ ¤ï¤ì¤³¤½µï¤ì ¤·¤­¤Ê¤Ù¤Æ ¤ï¤ì¤³¤½ ºÂ¤» ¤ï¤Ë¤³¤½¤Ï ¹ð¤é¤á ²È¤ò¤â̾¤ò¤â sed-3.62/testsuite/8bit.sed0000644000076600007660000000125510143133572012552 00000000000000# The first poem from the Man'yoshu. I like Hitomaro's poems better # but I couldn't find a copy of any of them in Japanese. This version # of this poem is from $BNc2r8E8l<-E5(B($BBh;0HG(B)$B;0>JF2(B. # # Speaking of Hitomaro, here is the english translation of one of my # favorites. I just know that everyone reading these test cases wants # to see this. # # In the autumn mountains # The yellow leaves are so thick. # Alas, how shall I seek my love # Who has wandered away? # # I see the messenger come # As the yellow leaves are falling. # Oh, well I remember # How on such a day we used to meet-- # My lover and I! # -- Kakinomoto Hitomaro # s/ÂçÏÂ/ÆüËÜ/ sed-3.62/testsuite/8to7.good0000644000076600007660000000123510143133572012660 00000000000000\344\306\244\342\244\350 \244\337\344\306\273\375\244\301$ \267\241\266\372\244\342\244\350 \244\337\267\241\266\372\273\375\244\ \301$ \244\263\244\316\265\326\244\313 \272\332\305\246\244\336\244\271\273\ \371$ \262\310\264\326\244\253\244\312 \271\360\244\351\244\265\244\315$ \244\275\244\351\244\337\244\304 \302\347\317\302\244\316\271\361\244\ \317$ \244\252\244\267\244\343\244\312\244\331\244\306 \244\357\244\354\244\ \263\244\275\265\357\244\354$ \244\267\244\255\244\312\244\331\244\306 \244\357\244\354\244\263\244\ \275 \272\302\244\273$ \244\357\244\313\244\263\244\275\244\317 \271\360\244\351\244\341$ \262\310\244\362\244\342\314\276\244\362\244\342$ sed-3.62/testsuite/8to7.inp0000644000076600007660000000026010143133572012513 00000000000000䯤â¤è ¤ß䯻ý¤Á ·¡¶ú¤â¤è ¤ß·¡¶ú»ý¤Á ¤³¤ÎµÖ¤Ë ºÚŦ¤Þ¤¹»ù ²È´Ö¤«¤Ê ¹ð¤é¤µ¤Í ¤½¤é¤ß¤Ä ÂçϤιñ¤Ï ¤ª¤·¤ã¤Ê¤Ù¤Æ ¤ï¤ì¤³¤½µï¤ì ¤·¤­¤Ê¤Ù¤Æ ¤ï¤ì¤³¤½ ºÂ¤» ¤ï¤Ë¤³¤½¤Ï ¹ð¤é¤á ²È¤ò¤â̾¤ò¤â sed-3.62/testsuite/8to7.sed0000644000076600007660000000000410143133572012474 00000000000000l;d sed-3.62/testsuite/Makefile.am0000644000076600007660000000603110202627264013242 00000000000000CLEANFILES = tmp* core *.core $(EXTRA_PROGRAMS) *.*out *.log TESTS = $(check_PROGRAMS) $(SEDTESTS) pcretest_LDADD = ../pcre/libpcre.a ../lib/libsed.a @INTLLIBS@ pcretest_DEPENDENCIES = ../pcre/libpcre.a ../lib/libsed.a check_PROGRAMS = pcretest AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_srcdir)/pcre \ -I$(top_builddir)/intl -I$(top_srcdir)/intl SEDTESTS = \ space appquit enable sep inclib 8bit newjis xabcx dollar noeol noeolw \ numsub numsub2 numsub3 numsub4 numsub5 0range bkslashes \ head madding mac-mf empty xbxcx xbxcx3 recall recall2 xemacs \ fasts uniq manis khadafy linecnt eval distrib 8to7 \ allsub cv-vars classes middle bsd stdin flipcase \ insens subwrite writeout readin \ help version file quiet \ factor binary3 binary2 binary dc TESTS_ENVIRONMENT = MAKE="$(MAKE)" VERSION="$(VERSION)" $(srcdir)/runtest EXTRA_DIST = runtest Makefile.tests \ pcre1.good pcre1.inp pcre1p.good \ pcre2.good pcre2.inp pcre2p.good \ pcre3.good pcre3.inp pcre3p.good \ 0range.good 0range.inp 0range.sed \ 8bit.good 8bit.inp 8bit.sed \ 8to7.good 8to7.inp 8to7.sed \ allsub.good allsub.inp allsub.sed \ appquit.good appquit.inp appquit.sed \ binary.good binary.inp binary.sed binary2.sed binary3.sed \ bkslashes.good bkslashes.inp bkslashes.sed \ bsd.good bsd.sh \ cv-vars.good cv-vars.inp cv-vars.sed \ classes.good classes.inp classes.sed \ dc.good dc.inp dc.sed \ distrib.good distrib.inp distrib.sed distrib.sh \ dollar.good dollar.inp dollar.sed \ empty.good empty.inp empty.sed \ enable.good enable.inp enable.sed \ eval.good eval.inp eval.sed \ factor.good factor.inp factor.sed \ fasts.good fasts.inp fasts.sed \ flipcase.good flipcase.inp flipcase.sed \ head.good head.inp head.sed \ inclib.good inclib.inp inclib.sed \ insens.good insens.inp insens.sed \ khadafy.good khadafy.inp khadafy.sed \ linecnt.good linecnt.inp linecnt.sed \ space.good space.inp space.sed \ mac-mf.good mac-mf.inp mac-mf.sed \ madding.good madding.inp madding.sed \ manis.good manis.inp manis.sed \ middle.good middle.sed middle.inp \ newjis.good newjis.inp newjis.sed \ noeol.good noeol.inp noeol.sed \ noeolw.good noeolw.1good noeolw.2good noeolw.sed \ numsub.good numsub.inp numsub.sed \ numsub2.good numsub2.inp numsub2.sed \ numsub3.good numsub3.inp numsub3.sed \ numsub4.good numsub4.inp numsub4.sed \ numsub5.good numsub5.inp numsub5.sed \ readin.good readin.in2 readin.inp readin.sed \ recall.good recall.inp recall.sed \ recall2.good recall2.inp recall2.sed \ sep.good sep.inp sep.sed \ subwrite.inp subwrite.sed subwrt1.good subwrt2.good \ uniq.good uniq.inp uniq.sed \ version.gin \ writeout.inp writeout.sed wrtout1.good wrtout2.good \ xabcx.good xabcx.inp xabcx.sed \ xbxcx.good xbxcx.inp xbxcx.sed \ xbxcx3.good xbxcx3.inp xbxcx3.sed \ xemacs.good xemacs.inp xemacs.sed clean-local: test x$(srcdir) = x. || rm -f readin.in2 eval.in2 # automake makes `check' depend on $(TESTS). Declare # dummy targets for $(TESTS) so that make does not complain. .PHONY: $(SEDTESTS) $(SEDTESTS): sed-3.62/testsuite/Makefile.in0000644000076600007660000004336110202630717013257 00000000000000# Makefile.in generated by automake 1.9.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = pcretest.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = pcretest$(EXEEXT) subdir = testsuite DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/codeset.m4 \ $(top_srcdir)/config/getline.m4 \ $(top_srcdir)/config/gettext-ver.m4 \ $(top_srcdir)/config/gettext.m4 \ $(top_srcdir)/config/glibc21.m4 $(top_srcdir)/config/iconv.m4 \ $(top_srcdir)/config/lcmessage.m4 \ $(top_srcdir)/config/lib-ld.m4 \ $(top_srcdir)/config/lib-link.m4 \ $(top_srcdir)/config/lib-prefix.m4 \ $(top_srcdir)/config/progtest.m4 \ $(top_srcdir)/config/stdbool.m4 \ $(top_srcdir)/config/strverscmp.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = pcretest_SOURCES = pcretest.c pcretest_OBJECTS = pcretest.$(OBJEXT) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = pcretest.c DIST_SOURCES = pcretest.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_HTML_FALSE = @BUILD_HTML_FALSE@ BUILD_HTML_TRUE = @BUILD_HTML_TRUE@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ HAVE__BOOL = @HAVE__BOOL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKEINFO_HTML_FALSE = @MAKEINFO_HTML_FALSE@ MAKEINFO_HTML_TRUE = @MAKEINFO_HTML_TRUE@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCREGREP = @PCREGREP@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED_FEATURE_VERSION = @SED_FEATURE_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TEXI2HTML = @TEXI2HTML@ TEXI2HTML_HTML_FALSE = @TEXI2HTML_HTML_FALSE@ TEXI2HTML_HTML_TRUE = @TEXI2HTML_HTML_TRUE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ CLEANFILES = tmp* core *.core $(EXTRA_PROGRAMS) *.*out *.log TESTS = $(check_PROGRAMS) $(SEDTESTS) pcretest_LDADD = ../pcre/libpcre.a ../lib/libsed.a @INTLLIBS@ pcretest_DEPENDENCIES = ../pcre/libpcre.a ../lib/libsed.a AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_srcdir)/pcre \ -I$(top_builddir)/intl -I$(top_srcdir)/intl SEDTESTS = \ space appquit enable sep inclib 8bit newjis xabcx dollar noeol noeolw \ numsub numsub2 numsub3 numsub4 numsub5 0range bkslashes \ head madding mac-mf empty xbxcx xbxcx3 recall recall2 xemacs \ fasts uniq manis khadafy linecnt eval distrib 8to7 \ allsub cv-vars classes middle bsd stdin flipcase \ insens subwrite writeout readin \ help version file quiet \ factor binary3 binary2 binary dc TESTS_ENVIRONMENT = MAKE="$(MAKE)" VERSION="$(VERSION)" $(srcdir)/runtest EXTRA_DIST = runtest Makefile.tests \ pcre1.good pcre1.inp pcre1p.good \ pcre2.good pcre2.inp pcre2p.good \ pcre3.good pcre3.inp pcre3p.good \ 0range.good 0range.inp 0range.sed \ 8bit.good 8bit.inp 8bit.sed \ 8to7.good 8to7.inp 8to7.sed \ allsub.good allsub.inp allsub.sed \ appquit.good appquit.inp appquit.sed \ binary.good binary.inp binary.sed binary2.sed binary3.sed \ bkslashes.good bkslashes.inp bkslashes.sed \ bsd.good bsd.sh \ cv-vars.good cv-vars.inp cv-vars.sed \ classes.good classes.inp classes.sed \ dc.good dc.inp dc.sed \ distrib.good distrib.inp distrib.sed distrib.sh \ dollar.good dollar.inp dollar.sed \ empty.good empty.inp empty.sed \ enable.good enable.inp enable.sed \ eval.good eval.inp eval.sed \ factor.good factor.inp factor.sed \ fasts.good fasts.inp fasts.sed \ flipcase.good flipcase.inp flipcase.sed \ head.good head.inp head.sed \ inclib.good inclib.inp inclib.sed \ insens.good insens.inp insens.sed \ khadafy.good khadafy.inp khadafy.sed \ linecnt.good linecnt.inp linecnt.sed \ space.good space.inp space.sed \ mac-mf.good mac-mf.inp mac-mf.sed \ madding.good madding.inp madding.sed \ manis.good manis.inp manis.sed \ middle.good middle.sed middle.inp \ newjis.good newjis.inp newjis.sed \ noeol.good noeol.inp noeol.sed \ noeolw.good noeolw.1good noeolw.2good noeolw.sed \ numsub.good numsub.inp numsub.sed \ numsub2.good numsub2.inp numsub2.sed \ numsub3.good numsub3.inp numsub3.sed \ numsub4.good numsub4.inp numsub4.sed \ numsub5.good numsub5.inp numsub5.sed \ readin.good readin.in2 readin.inp readin.sed \ recall.good recall.inp recall.sed \ recall2.good recall2.inp recall2.sed \ sep.good sep.inp sep.sed \ subwrite.inp subwrite.sed subwrt1.good subwrt2.good \ uniq.good uniq.inp uniq.sed \ version.gin \ writeout.inp writeout.sed wrtout1.good wrtout2.good \ xabcx.good xabcx.inp xabcx.sed \ xbxcx.good xbxcx.inp xbxcx.sed \ xbxcx3.good xbxcx3.inp xbxcx3.sed \ xemacs.good xemacs.inp xemacs.sed all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits testsuite/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnits testsuite/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) pcretest$(EXEEXT): $(pcretest_OBJECTS) $(pcretest_DEPENDENCIES) @rm -f pcretest$(EXEEXT) $(LINK) $(pcretest_LDFLAGS) $(pcretest_OBJECTS) $(pcretest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-local ctags distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am clean-local: test x$(srcdir) = x. || rm -f readin.in2 eval.in2 # automake makes `check' depend on $(TESTS). Declare # dummy targets for $(TESTS) so that make does not complain. .PHONY: $(SEDTESTS) $(SEDTESTS): # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: sed-3.62/testsuite/Makefile.tests0000644000076600007660000001132110202627247014006 00000000000000# Testsuite makefile for GNU sed SHELL = /bin/sh # These are only fallback values. They are usually overridden by runtest. srcdir = . SED = ../sed/sed SEDENV = LC_ALL=C $(TIME) #TIME=time CMP=cmp RM=rm -f enable sep inclib 8bit 8to7 newjis xabcx dollar noeol bkslashes \ numsub head madding mac-mf empty xbxcx xbxcx3 recall recall2 xemacs \ appquit fasts uniq manis linecnt khadafy allsub flipcase space:: $(SEDENV) $(SED) -f $(srcdir)/$@.sed \ < $(srcdir)/$@.inp > $@.out $(CMP) $(srcdir)/$@.good $@.out @$(RM) $@.out 0range:: $(SEDENV) $(SED) -s -f $(srcdir)/$@.sed < $(srcdir)/$@.inp > $@.out $(CMP) $(srcdir)/$@.good $@.out @$(RM) $@.out # This checks for a bug in 3.02 and 3.02.80 stdin:: ($(SEDENV) $(SED) d; $(SEDENV) $(SED) G) < $(srcdir)/numsub.inp > $@.1out $(SEDENV) cat $(srcdir)/numsub.inp | ($(SEDENV) $(SED) d; $(SEDENV) $(SED) G) > $@.2out $(CMP) $@.1out $@.2out @$(RM) $@.1out $@.2out cv-vars classes middle dc distrib factor numsub2 numsub3 numsub4 numsub5 \ insens:: $(SEDENV) $(SED) -n -f $(srcdir)/$@.sed < $(srcdir)/$@.inp > $@.out $(CMP) $(srcdir)/$@.good $@.out @$(RM) $@.out noeolw:: $(SEDENV) $(SED) -n -f $(srcdir)/$@.sed \ $(srcdir)/noeol.inp $(srcdir)/noeol.inp > $@.out $(CMP) $(srcdir)/$@.good $@.out $(CMP) $(srcdir)/$@.1good $@.1out $(CMP) $(srcdir)/$@.2good $@.2out @$(RM) $@.1out $@.2out $@.out subwrite:: $(SEDENV) $(SED) -f $(srcdir)/$@.sed < $(srcdir)/$@.inp > $@.1out $(CMP) $(srcdir)/subwrt1.good $@.1out $(CMP) $(srcdir)/subwrt2.good $@.wout @$(RM) $@.1out $@.wout bsd:: $(SEDENV) sh $(srcdir)/$@.sh '$(SED)' bsd.out $(CMP) $(srcdir)/$@.good $@.out @$(RM) $@.out writeout:: $(SEDENV) $(SED) -f $(srcdir)/$@.sed < $(srcdir)/$@.inp >$@.1out $(CMP) $(srcdir)/wrtout1.good $@.1out $(CMP) $(srcdir)/wrtout2.good $@.wout @$(RM) $@.1out $@.wout readin.in2: $(srcdir)/readin.in2 cat $(srcdir)/readin.in2 > $@ readin:: readin.in2 $(SEDENV) $(SED) -f $(srcdir)/$@.sed < $(srcdir)/$@.inp >$@.out $(CMP) $(srcdir)/$@.good $@.out @$(RM) $@.out eval.in2: $(srcdir)/eval.inp cat $(srcdir)/eval.inp > $@ eval:: eval.in2 $(SEDENV) $(SED) -f $(srcdir)/$@.sed < $(srcdir)/$@.inp > $@.out $(CMP) $(srcdir)/$@.good $@.out @$(RM) $@.out binary binary2 binary3:: $(SEDENV) $(SED) -n -f $(srcdir)/$@.sed < $(srcdir)/binary.inp >$@.out $(CMP) $(srcdir)/binary.good $@.out @$(RM) $@.out # # cmdlines targets # help:: $(SED) --help | $(SED) '1s/ [^ ]* / sed /' > $@.1out $(SED) 2>&1 | $(SED) '1s/ [^ ]* / sed /' > $@.2out || : $(CMP) $@.1out $@.2out @$(RM) $@.1out $@.2out version:: $(SED) 's^@'VERSION'@^$(VERSION)^' $(srcdir)/version.gin > $@.good $(SEDENV) $(SED) --version > $@.out 2>&1 $(CMP) $@.good $@.out @$(RM) $@.good $@.out file:: $(SEDENV) $(SED) --file=$(srcdir)/newjis.sed \ < $(srcdir)/newjis.inp > $@.out $(CMP) $(srcdir)/newjis.good $@.out @$(RM) $@.out quiet:: $(SEDENV) $(SED) --quiet -f $(srcdir)/cv-vars.sed \ < $(srcdir)/cv-vars.inp > $@.out $(CMP) $(srcdir)/cv-vars.good $@.out @$(RM) $@.out # The following target is not used in super sed builds (only GNU sed) bug-regex7$(EXEEXT) bug-regex8$(EXEEXT) bug-regex9$(EXEEXT) \ bug-regex10$(EXEEXT) bug-regex11$(EXEEXT) bug-regex12$(EXEEXT) \ bug-regex13$(EXEEXT) bug-regex14$(EXEEXT) bug-regex15$(EXEEXT) bug-regex16$(EXEEXT) \ bug-regex21$(EXEEXT) runtests$(EXEEXT) runptests$(EXEEXT): echo "$(SEDENV) ./$@ > `echo $@ | $(SED) s/$(EXEEXT)$$/.log/`" @$(SEDENV) ./$@ > `echo $@ | $(SED) s/$(EXEEXT)$$/.log/` tst-pcre$(EXEEXT): $(SEDENV) ./tst-pcre $(srcdir)/PCRE.tests > tst-pcre.log tst-boost$(EXEEXT): $(SEDENV) ./tst-boost $(srcdir)/BOOST.tests > tst-boost.log tst-rxspencer$(EXEEXT): $(SEDENV) ./tst-rxspencer $(srcdir)/SPENCER.tests > tst-spencer.log # The following target is not used in GNU sed builds (only super-sed) pcretest$(EXEEXT):: $(SEDENV) ./pcretest $(srcdir)/pcre1.inp pcre1.out $(CMP) $(srcdir)/pcre1.good pcre1.out #$(SEDENV) ./pcretest -p $(srcdir)/pcre1.inp pcre1p.out #$(CMP) $(srcdir)/pcre1p.good pcre1p.out $(SEDENV) ./pcretest -P $(srcdir)/pcre2.inp pcre2.out $(CMP) $(srcdir)/pcre2.good pcre2.out $(SEDENV) ./pcretest -P -p $(srcdir)/pcre2.inp pcre2p.out $(CMP) $(srcdir)/pcre2p.good pcre2p.out $(SEDENV) ./pcretest $(srcdir)/pcre3.inp pcre3.out $(CMP) $(srcdir)/pcre3.good pcre3.out $(SEDENV) ./pcretest -p $(srcdir)/pcre3.inp pcre3p.out $(CMP) $(srcdir)/pcre3p.good pcre3p.out @$(RM) pcre*.out .PHONY: \ bug-regex7$(EXEEXT) bug-regex8$(EXEEXT) bug-regex9$(EXEEXT) \ bug-regex10$(EXEEXT) bug-regex11$(EXEEXT) bug-regex12$(EXEEXT) \ bug-regex13$(EXEEXT) bug-regex14$(EXEEXT) bug-regex15$(EXEEXT) bug-regex16$(EXEEXT) \ bug-regex21$(EXEEXT) runtests$(EXEEXT) runptests$(EXEEXT) \ tst-pcre$(EXEEXT) tst-boost$(EXEEXT) tst-rxspencer$(EXEEXT) pcretest$(EXEEXT) sed-3.62/testsuite/allsub.good0000644000076600007660000000010710143133572013336 00000000000000bar bar fo oo f oo bar bar bar bar bar bar bar bar bar bar bar bar bar sed-3.62/testsuite/allsub.inp0000644000076600007660000000010710143133572013174 00000000000000foo foo fo oo f oo foo foo foo foo foo foo foo foo foo foo foo foo foo sed-3.62/testsuite/allsub.sed0000644000076600007660000000001410143133572013156 00000000000000s/foo/bar/g sed-3.62/testsuite/appquit.good0000644000076600007660000000000710202627247013541 00000000000000doh ok sed-3.62/testsuite/appquit.inp0000644000076600007660000000000410202627247013374 00000000000000doh sed-3.62/testsuite/appquit.sed0000644000076600007660000000003610202627247013366 00000000000000# Test appending quit a\ ok q sed-3.62/testsuite/binary.good0000644000076600007660000000003210143133572013335 00000000000000192 168 1 0 192 168 1 255 sed-3.62/testsuite/binary.inp0000644000076600007660000000031410143133572013176 00000000000000192.168.1.2 br b8dpP 16>11111111& dpP 8>11111111& dpP 11111111& dpP | DDD 24>dpP 16>11111111& dpP 8>11111111& dpP 11111111& dpP sed-3.62/testsuite/binary.sed0000644000076600007660000001141110143133572013163 00000000000000# A kind of clone of dc geared towards binary operations. # by Paolo Bonzini # # commands available: # conversion commands # b convert decimal to binary # d convert binary to decimal # # arithmetic commands # < shift left binary by decimal number of bits (11 3< gives 11000) # > shift right binary by decimal number of bits (1011 2> gives 10) # & binary AND (between two binary operands) # | binary OR (between two binary operands) # ^ binary XOR (between two binary operands) # ~ binary NOT (between one binary operand) # # stack manipulation commands # c clear stack # P pop stack top # D duplicate stack top # x exchange top two elements # r rotate stack counter-clockwise (second element becomes first) # R rotate stack clockwise (last element becomes first) # # other commands # l print stack (stack top is first) # p print stack top # q quit, print stack top if any (cq is quiet quit) # # The only shortcoming is that you'd better not attempt conversions of # values above 1000 or so. # # This version does everything in pattern space (a la dc.sed). # -------------------------------------------------------------------------- # This was actually used in a one-disk distribution of Linux to compute # netmasks as follows (1 parameter => compute netmask e.g. 24 becomes # 255.255.255.0; 2 parameters => given host address and netmask compute # network and broadcast addresses): # # if [ $# = 1 ]; then # OUTPUT='$1.$2.$3.$4' # set 255.255.255.255 $1 # else # OUTPUT='$1.$2.$3.$4 $5.$6.$7.$8' # fi # # if [ `expr $2 : ".*\\."` -gt 0 ]; then # MASK="$2 br b8dpP 16>11111111& dpP 8>11111111& dpP 11111111& dpP # | DDD 24>dpP 16>11111111& dpP 8>11111111& dpP 11111111& dpP # " | sed -f binary.sed` # # eval echo $OUTPUT # -------------------------------------------------------------------------- 1s/^/%%/ :cmd s/\(.*%%\) *\([0-9][0-9]*\)/\2\ \1/ tcmd s/%% *#.*/%%/ /%%$/ { $b quit N } /^.*%%D/ s/^[^\n]*\n/&&/ /^.*%%P/ s/^[^\n]*\n// /^.*%%x/ s/^\([^\n]*\n\)\([^\n]*\n\)/\2\1/ /^.*%%r/ s/^\([^\n]*\n\)\([^%]*\)/\2\1/ /^.*%%R/ s/^\([^%]*\n\)\([^\n]*\n\)/\2\1/ /^.*%%c/ s/^.*%%/%%/ /^.*%%p/ P /^.*%%l/ { h s/.%%.*// p g } /^.*%%q/ { :quit /^%%/!P d } /^.*%%b/ { # Decimal to binary via analog form s/^\([^\n]*\)/-&;9876543210aaaaaaaaa/ :d2bloop1 s/\(a*\)-\(.\)\([^;]*;[0-9]*\2.\{9\}\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4-\3/ t d2bloop1 s/-;9876543210aaaaaaaaa/;a01!/ :d2bloop2 s/\(a*\)\1\(a\{0,1\}\)\(;\2.\(.\)[^!]*!\)/\1\3\4/ /^a/b d2bloop2 s/[^!]*!// } /^.*%%d/ { # Binary to decimal via analog form s/^\([^\n]*\)/-&;10a/ :b2dloop1 s/\(a*\)-\(.\)\([^;]*;[0-9]*\2.\(a*\)\)/\1\1\4-\3/ t b2dloop1 s/-;10a/;aaaaaaaaa0123456789!/ :b2dloop2 s/\(a*\)\1\1\1\1\1\1\1\1\1\(a\{0,9\}\)\(;\2.\{9\}\(.\)[^!]*!\)/\1\3\4/ /^a/b b2dloop2 s/[^!]*!// } /^.*%%&/ { # Binary AND s/\([^\n]*\)\n\([^\n]*\)/-\1-\2-111 01000/ :andloop s/\([^-]*\)-\([^-]*\)\([^-]\)-\([^-]*\)\([^-]\)-\([01 ]*\3\5\([01]\)\)/\7\1-\2-\4-\6/ t andloop s/^0*\([^-]*\)-[^\n]*/\1/ s/^\n/0&/ } /^.*%%^/ { # Binary XOR s/\([^\n]*\)\n\([^\n]*\)/-\1-\2-000 01101/ b orloop } /^.*%%|/ { # Binary OR s/\([^\n]*\)\n\([^\n]*\)/-\1-\2-000 10111/ :orloop s/\([^-]*\)-\([^-]*\)\([^-]\)-\([^-]*\)\([^-]\)-\([01 ]*\3\5\([01]\)\)/\7\1-\2-\4-\6/ t orloop s/\([^-]*\)-\([^-]*\)-\([^-]*\)-[^\n]*/\2\3\1/ } /^.*%%~/ { # Binary NOT s/^\(.\)\([^\n]*\n\)/\1-010-\2/ :notloop s/\(.\)-0\{0,1\}\1\(.\)0\{0,1\}-\([01\n]\)/\2\3-010-/ t notloop # If result is 00001..., \3 does not match (it looks for -10) and we just # remove the table and leading zeros. If result is 0000...0, \3 matches # (it looks for -0), \4 is a zero and we leave a lone zero as top of the # stack. s/0*\(1\{0,1\}\)\([^-]*\)-\(\1\(0\)\)\{0,1\}[^-]*-/\4\1\2/ } /^.*%%/ { # Right shift, convert to analog and remove a binary digit for each analog digit s/^\([^\n]*\)/-&;9876543210aaaaaaaaa/ :rshloop1 s/\(a*\)-\(.\)\([^;]*;[0-9]*\2.\{9\}\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4-\3/ t rshloop1 s/^\(a*\)-;9876543210aaaaaaaaa\n\([^\n]*\)/\2\1/ :rshloop2 s/.a// s/^aa*/0/ /a\n/b rshloop2 } s/%%./%%/ tcmd sed-3.62/testsuite/binary2.sed0000644000076600007660000001172010143133572013250 00000000000000# A kind of clone of dc geared towards binary operations. # by Paolo Bonzini # # commands available: # conversion commands # b convert decimal to binary # d convert binary to decimal # # arithmetic commands # < shift left binary by decimal number of bits (11 3< gives 11000) # > shift right binary by decimal number of bits (1011 2> gives 10) # & binary AND (between two binary operands) # | binary OR (between two binary operands) # ^ binary XOR (between two binary operands) # ~ binary NOT (between one binary operand) # # stack manipulation commands # c clear stack # P pop stack top # D duplicate stack top # x exchange top two elements # r rotate stack counter-clockwise (second element becomes first) # R rotate stack clockwise (last element becomes first) # # other commands # l print stack (stack top is first) # p print stack top # q quit, print stack top if any (cq is quiet quit) # # The only shortcoming is that you'd better not attempt conversions of # values above 1000 or so. # # This version keeps the stack in hold space and the command in pattern # space; it is the fastest one (though the gap with binary3.sed is small). # -------------------------------------------------------------------------- # This was actually used in a one-disk distribution of Linux to compute # netmasks as follows (1 parameter => compute netmask e.g. 24 becomes # 255.255.255.0; 2 parameters => given host address and netmask compute # network and broadcast addresses): # # if [ $# = 1 ]; then # OUTPUT='$1.$2.$3.$4' # set 255.255.255.255 $1 # else # OUTPUT='$1.$2.$3.$4 $5.$6.$7.$8' # fi # # if [ `expr $2 : ".*\\."` -gt 0 ]; then # MASK="$2 br b8dpP 16>11111111& dpP 8>11111111& dpP 11111111& dpP # | DDD 24>dpP 16>11111111& dpP 8>11111111& dpP 11111111& dpP # " | sed -f binary.sed` # # eval echo $OUTPUT # -------------------------------------------------------------------------- :cmd s/^[\n\t ]*// s/^#.*// /^$/ { $b quit N t cmd } /^[0-9][0-9]*/ { G h s/^[0-9][0-9]* *\([^\n]*\).*/\1/ x s/^\([0-9][0-9]*\)[^\n]*/\1/ x t cmd } /^[^DPxrRcplqbd&|^~<>]/b bad /^D/ { x s/^[^\n]*\n/&&/ } /^P/ { x s/^[^\n]*\n// } /^x/ { x s/^\([^\n]*\n\)\([^\n]*\n\)/\2\1/ } /^r/ { x s/^\([^\n]*\n\)\(.*\)/\2\1/ } /^R/ { x s/^\(.*\n\)\([^\n]*\n\)/\2\1/ } /^c/ { x s/.*// } /^p/ { x P } /^l/ { x p } /^q/ { :quit x /./P d } /^b/ { # Decimal to binary via analog form x s/^\([^\n]*\)/-&;9876543210aaaaaaaaa/ :d2bloop1 s/\(a*\)-\(.\)\([^;]*;[0-9]*\2.\{9\}\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4-\3/ t d2bloop1 s/-;9876543210aaaaaaaaa/;a01!/ :d2bloop2 s/\(a*\)\1\(a\{0,1\}\)\(;\2.\(.\)[^!]*!\)/\1\3\4/ /^a/b d2bloop2 s/[^!]*!// } /^d/ { # Binary to decimal via analog form x s/^\([^\n]*\)/-&;10a/ :b2dloop1 s/\(a*\)-\(.\)\([^;]*;[0-9]*\2.\(a*\)\)/\1\1\4-\3/ t b2dloop1 s/-;10a/;aaaaaaaaa0123456789!/ :b2dloop2 s/\(a*\)\1\1\1\1\1\1\1\1\1\(a\{0,9\}\)\(;\2.\{9\}\(.\)[^!]*!\)/\1\3\4/ /^a/b b2dloop2 s/[^!]*!// } /^&/ { # Binary AND x s/\([^\n]*\)\n\([^\n]*\)/-\1-\2-111 01000/ :andloop s/\([^-]*\)-\([^-]*\)\([^-]\)-\([^-]*\)\([^-]\)-\([01 ]*\3\5\([01]\)\)/\7\1-\2-\4-\6/ t andloop s/^0*\([^-]*\)-[^\n]*/\1/ s/^\n/0&/ } /^\^/ { # Binary XOR x s/\([^\n]*\)\n\([^\n]*\)/-\1-\2-000 01101/ b orloop } /^|/ { # Binary OR x s/\([^\n]*\)\n\([^\n]*\)/-\1-\2-000 10111/ :orloop s/\([^-]*\)-\([^-]*\)\([^-]\)-\([^-]*\)\([^-]\)-\([01 ]*\3\5\([01]\)\)/\7\1-\2-\4-\6/ t orloop s/\([^-]*\)-\([^-]*\)-\([^-]*\)-[^\n]*/\2\3\1/ } /^~/ { # Binary NOT x s/^\(.\)\([^\n]*\n\)/\1-010-\2/ :notloop s/\(.\)-0\{0,1\}\1\(.\)0\{0,1\}-\([01\n]\)/\2\3-010-/ t notloop # If result is 00001..., \3 does not match (it looks for -10) and we just # remove the table and leading zeros. If result is 0000...0, \3 matches # (it looks for -0), \4 is a zero and we leave a lone zero as top of the # stack. s/0*\(1\{0,1\}\)\([^-]*\)-\(\1\(0\)\)\{0,1\}[^-]*-/\4\1\2/ } /^/ { # Right shift, convert to analog and remove a binary digit for each analog digit x s/^\([^\n]*\)/-&;9876543210aaaaaaaaa/ :rshloop1 s/\(a*\)-\(.\)\([^;]*;[0-9]*\2.\{9\}\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4-\3/ t rshloop1 s/^\(a*\)-;9876543210aaaaaaaaa\n\([^\n]*\)/\2\1/ :rshloop2 s/.a// s/^aa*/0/ /a\n/b rshloop2 } x :bad s/^.// tcmd sed-3.62/testsuite/binary3.sed0000644000076600007660000001204610143133572013253 00000000000000# A kind of clone of dc geared towards binary operations. # by Paolo Bonzini # # commands available: # conversion commands # b convert decimal to binary # d convert binary to decimal # # arithmetic commands # < shift left binary by decimal number of bits (11 3< gives 11000) # > shift right binary by decimal number of bits (1011 2> gives 10) # & binary AND (between two binary operands) # | binary OR (between two binary operands) # ^ binary XOR (between two binary operands) # ~ binary NOT (between one binary operand) # # stack manipulation commands # c clear stack # P pop stack top # D duplicate stack top # x exchange top two elements # r rotate stack counter-clockwise (second element becomes first) # R rotate stack clockwise (last element becomes first) # # other commands # l print stack (stack top is first) # p print stack top # q quit, print stack top if any (cq is quiet quit) # # The only shortcoming is that you'd better not attempt conversions of # values above 1000 or so. # # This version keeps the stack and the current command in hold space and # the commands in pattern space; it is just a bit slower than binary2.sed # but more size optimized for broken seds which have a 199-command limit # (though binary2.sed does not have this much). # # -------------------------------------------------------------------------- # This was actually used in a one-disk distribution of Linux to compute # netmasks as follows (1 parameter => compute netmask e.g. 24 becomes # 255.255.255.0; 2 parameters => given host address and netmask compute # network and broadcast addresses): # # if [ $# = 1 ]; then # OUTPUT='$1.$2.$3.$4' # set 255.255.255.255 $1 # else # OUTPUT='$1.$2.$3.$4 $5.$6.$7.$8' # fi # # if [ `expr $2 : ".*\\."` -gt 0 ]; then # MASK="$2 br b8dpP 16>11111111& dpP 8>11111111& dpP 11111111& dpP # | DDD 24>dpP 16>11111111& dpP 8>11111111& dpP 11111111& dpP # " | sed -f binary.sed` # # eval echo $OUTPUT # -------------------------------------------------------------------------- :cmd s/^[\n\t ]*// s/^#.*// /^$/ { $b quit N t cmd } /^[0-9][0-9]*/ { G h s/^[0-9][0-9]* *\([^\n]*\).*/\1/ x s/^\([0-9][0-9]*\)[^\n]*/\1/ x t cmd } /^[^DPxrRcplqbd&|^~<>]/bbad H x s/\(\n[^\n]\)[^\n]*$/\1/ /D$/ s/^[^\n]*\n/&&/ /P$/ s/^[^\n]*\n// /x$/ s/^\([^\n]*\n\)\([^\n]*\n\)/\2\1/ /r$/ s/^\([^\n]*\n\)\(.*\)\(..\)/\2\1\3/ /R$/ s/^\(.*\n\)\([^\n]*\n\)\(..\)/\2\1\3/ /c$/ s/.*// /p$/ P /l$/ { s/...$// p t cmd } /q$/ { :quit /.../P d } /b$/ { # Decimal to binary via analog form s/^\([^\n]*\)/-&;9876543210aaaaaaaaa/ :d2bloop1 s/\(a*\)-\(.\)\([^;]*;[0-9]*\2.\{9\}\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4-\3/ t d2bloop1 s/-;9876543210aaaaaaaaa/;a01!/ :d2bloop2 s/\(a*\)\1\(a\{0,1\}\)\(;\2.\(.\)[^!]*!\)/\1\3\4/ /^a/b d2bloop2 s/[^!]*!// } /d$/ { # Binary to decimal via analog form s/^\([^\n]*\)/-&;10a/ :b2dloop1 s/\(a*\)-\(.\)\([^;]*;[0-9]*\2.\(a*\)\)/\1\1\4-\3/ t b2dloop1 s/-;10a/;aaaaaaaaa0123456789!/ :b2dloop2 s/\(a*\)\1\1\1\1\1\1\1\1\1\(a\{0,9\}\)\(;\2.\{9\}\(.\)[^!]*!\)/\1\3\4/ /^a/b b2dloop2 s/[^!]*!// } /&$/ { # Binary AND s/\([^\n]*\)\n\([^\n]*\)/-\1-\2-111 01000/ :andloop s/\([^-]*\)-\([^-]*\)\([^-]\)-\([^-]*\)\([^-]\)-\([01 ]*\3\5\([01]\)\)/\7\1-\2-\4-\6/ t andloop s/^0*\([^-]*\)-[^\n]*/\1/ s/^\n/0&/ } /\^$/ { # Binary XOR s/\([^\n]*\)\n\([^\n]*\)/-\1-\2-000 01101/ b orloop } /|$/ { # Binary OR s/\([^\n]*\)\n\([^\n]*\)/-\1-\2-000 10111/ :orloop s/\([^-]*\)-\([^-]*\)\([^-]\)-\([^-]*\)\([^-]\)-\([01 ]*\3\5\([01]\)\)/\7\1-\2-\4-\6/ t orloop s/\([^-]*\)-\([^-]*\)-\([^-]*\)-[^\n]*/\2\3\1/ } /~$/ { # Binary NOT s/^\(.\)\([^\n]*\n\)/\1-010-\2/ :notloop s/\(.\)-0\{0,1\}\1\(.\)0\{0,1\}-\([01\n]\)/\2\3-010-/ t notloop # If result is 00001..., \3 does not match (it looks for -10) and we just # remove the table and leading zeros. If result is 0000...0, \3 matches # (it looks for -0), \4 is a zero and we leave a lone zero as top of the # stack. s/0*\(1\{0,1\}\)\([^-]*\)-\(\1\(0\)\)\{0,1\}[^-]*-/\4\1\2/ } /<$/ { # Left shift, convert to analog and add a binary digit for each analog digit s/^\([^\n]*\)/-&;9876543210aaaaaaaaa/ :lshloop1 s/\(a*\)-\(.\)\([^;]*;[0-9]*\2.\{9\}\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4-\3/ t lshloop1 s/^\(a*\)-;9876543210aaaaaaaaa\n\([^\n]*\)/\2\1/ s/a/0/g } />$/ { # Right shift, convert to analog and remove a binary digit for each analog digit s/^\([^\n]*\)/-&;9876543210aaaaaaaaa/ :rshloop1 s/\(a*\)-\(.\)\([^;]*;[0-9]*\2.\{9\}\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4-\3/ t rshloop1 s/^\(a*\)-;9876543210aaaaaaaaa\n\([^\n]*\)/\2\1/ :rshloop2 s/.a// s/^aa*/0/ /a\n/b rshloop2 } s/..$// x :bad s/^.// tcmd sed-3.62/testsuite/bkslashes.good0000644000076600007660000000000410143133572014027 00000000000000a\ sed-3.62/testsuite/bkslashes.inp0000644000076600007660000000000210143133572013663 00000000000000a sed-3.62/testsuite/bkslashes.sed0000644000076600007660000000003410143133572013655 00000000000000# bug in sed 4.0b s/$/\\\ / sed-3.62/testsuite/bsd.good0000644000076600007660000003562410143133572012640 00000000000000============ Test 1.1:101 ============ Testing argument parsing First type e1_l1_1 e1_l1_1 e1_l1_2 e1_l1_2 e1_l1_3 e1_l1_3 e1_l1_4 e1_l1_4 e1_l1_5 e1_l1_5 e1_l1_6 e1_l1_6 e1_l1_7 e1_l1_7 e1_l1_8 e1_l1_8 e1_l1_9 e1_l1_9 e1_l1_10 e1_l1_10 e1_l1_11 e1_l1_11 e1_l1_12 e1_l1_12 e1_l1_13 e1_l1_13 e1_l1_14 e1_l1_14 ============ Test 1.2:102 ============ e1_l1_1 e1_l1_2 e1_l1_3 e1_l1_4 e1_l1_5 e1_l1_6 e1_l1_7 e1_l1_8 e1_l1_9 e1_l1_10 e1_l1_11 e1_l1_12 e1_l1_13 e1_l1_14 ============ Test 1.3:103 ============ e1_l1_1 e1_l1_1 e1_l1_2 e1_l1_2 e1_l1_3 e1_l1_3 e1_l1_4 e1_l1_4 e1_l1_5 e1_l1_5 e1_l1_6 e1_l1_6 e1_l1_7 e1_l1_7 e1_l1_8 e1_l1_8 e1_l1_9 e1_l1_9 e1_l1_10 e1_l1_10 e1_l1_11 e1_l1_11 e1_l1_12 e1_l1_12 e1_l1_13 e1_l1_13 e1_l1_14 e1_l1_14 ============ Test 1.4:104 ============ e1_l1_1 e1_l1_2 e1_l1_3 e1_l1_4 e1_l1_5 e1_l1_6 e1_l1_7 e1_l1_8 e1_l1_9 e1_l1_10 e1_l1_11 e1_l1_12 e1_l1_13 e1_l1_14 Second type ============== Test 1.4.1:105 ============== l1_1 l1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 ============ Test 1.5:106 ============ s1_l1_1 s1_l1_1 s1_l1_2 s1_l1_2 s1_l1_3 s1_l1_3 s1_l1_4 s1_l1_4 s1_l1_5 s1_l1_5 s1_l1_6 s1_l1_6 s1_l1_7 s1_l1_7 s1_l1_8 s1_l1_8 s1_l1_9 s1_l1_9 s1_l1_10 s1_l1_10 s1_l1_11 s1_l1_11 s1_l1_12 s1_l1_12 s1_l1_13 s1_l1_13 s1_l1_14 s1_l1_14 ============ Test 1.6:107 ============ s1_l1_1 s1_l1_1 s1_l1_2 s1_l1_2 s1_l1_3 s1_l1_3 s1_l1_4 s1_l1_4 s1_l1_5 s1_l1_5 s1_l1_6 s1_l1_6 s1_l1_7 s1_l1_7 s1_l1_8 s1_l1_8 s1_l1_9 s1_l1_9 s1_l1_10 s1_l1_10 s1_l1_11 s1_l1_11 s1_l1_12 s1_l1_12 s1_l1_13 s1_l1_13 s1_l1_14 s1_l1_14 ============ Test 1.7:108 ============ e1_l1_1 e1_l1_1 e1_l1_2 e1_l1_2 e1_l1_3 e1_l1_3 e1_l1_4 e1_l1_4 e1_l1_5 e1_l1_5 e1_l1_6 e1_l1_6 e1_l1_7 e1_l1_7 e1_l1_8 e1_l1_8 e1_l1_9 e1_l1_9 e1_l1_10 e1_l1_10 e1_l1_11 e1_l1_11 e1_l1_12 e1_l1_12 e1_l1_13 e1_l1_13 e1_l1_14 e1_l1_14 ============ Test 1.8:109 ============ e1_l1_1 e1_l1_1 e1_l1_2 e1_l1_2 e1_l1_3 e1_l1_3 e1_l1_4 e1_l1_4 e1_l1_5 e1_l1_5 e1_l1_6 e1_l1_6 e1_l1_7 e1_l1_7 e1_l1_8 e1_l1_8 e1_l1_9 e1_l1_9 e1_l1_10 e1_l1_10 e1_l1_11 e1_l1_11 e1_l1_12 e1_l1_12 e1_l1_13 e1_l1_13 e1_l1_14 e1_l1_14 ============ Test 1.9:110 ============ s1_l1_1 s1_l1_2 s1_l1_3 s1_l1_4 s1_l1_5 s1_l1_6 s1_l1_7 s1_l1_8 s1_l1_9 s1_l1_10 s1_l1_11 s1_l1_12 s1_l1_13 s1_l1_14 ============= Test 1.10:111 ============= s1_l1_1 s1_l1_2 s1_l1_3 s1_l1_4 s1_l1_5 s1_l1_6 s1_l1_7 s1_l1_8 s1_l1_9 s1_l1_10 s1_l1_11 s1_l1_12 s1_l1_13 s1_l1_14 ============= Test 1.11:112 ============= e1_l1_1 e1_l1_2 e1_l1_3 e1_l1_4 e1_l1_5 e1_l1_6 e1_l1_7 e1_l1_8 e1_l1_9 e1_l1_10 e1_l1_11 e1_l1_12 e1_l1_13 e1_l1_14 ============= Test 1.12:113 ============= e1_l1_1 e1_l1_2 e1_l1_3 e1_l1_4 e1_l1_5 e1_l1_6 e1_l1_7 e1_l1_8 e1_l1_9 e1_l1_10 e1_l1_11 e1_l1_12 e1_l1_13 e1_l1_14 ============= Test 1.13:114 ============= e1_l1_1 e2_e1_l1_1 e2_e1_l1_1 e1_l1_2 e2_e1_l1_2 e2_e1_l1_2 e1_l1_3 e2_e1_l1_3 e2_e1_l1_3 e1_l1_4 e2_e1_l1_4 e2_e1_l1_4 e1_l1_5 e2_e1_l1_5 e2_e1_l1_5 e1_l1_6 e2_e1_l1_6 e2_e1_l1_6 e1_l1_7 e2_e1_l1_7 e2_e1_l1_7 e1_l1_8 e2_e1_l1_8 e2_e1_l1_8 e1_l1_9 e2_e1_l1_9 e2_e1_l1_9 e1_l1_10 e2_e1_l1_10 e2_e1_l1_10 e1_l1_11 e2_e1_l1_11 e2_e1_l1_11 e1_l1_12 e2_e1_l1_12 e2_e1_l1_12 e1_l1_13 e2_e1_l1_13 e2_e1_l1_13 e1_l1_14 e2_e1_l1_14 e2_e1_l1_14 ============= Test 1.14:115 ============= s1_l1_1 s2_s1_l1_1 s2_s1_l1_1 s1_l1_2 s2_s1_l1_2 s2_s1_l1_2 s1_l1_3 s2_s1_l1_3 s2_s1_l1_3 s1_l1_4 s2_s1_l1_4 s2_s1_l1_4 s1_l1_5 s2_s1_l1_5 s2_s1_l1_5 s1_l1_6 s2_s1_l1_6 s2_s1_l1_6 s1_l1_7 s2_s1_l1_7 s2_s1_l1_7 s1_l1_8 s2_s1_l1_8 s2_s1_l1_8 s1_l1_9 s2_s1_l1_9 s2_s1_l1_9 s1_l1_10 s2_s1_l1_10 s2_s1_l1_10 s1_l1_11 s2_s1_l1_11 s2_s1_l1_11 s1_l1_12 s2_s1_l1_12 s2_s1_l1_12 s1_l1_13 s2_s1_l1_13 s2_s1_l1_13 s1_l1_14 s2_s1_l1_14 s2_s1_l1_14 ============= Test 1.15:116 ============= e1_l1_1 s1_e1_l1_1 s1_e1_l1_1 e1_l1_2 s1_e1_l1_2 s1_e1_l1_2 e1_l1_3 s1_e1_l1_3 s1_e1_l1_3 e1_l1_4 s1_e1_l1_4 s1_e1_l1_4 e1_l1_5 s1_e1_l1_5 s1_e1_l1_5 e1_l1_6 s1_e1_l1_6 s1_e1_l1_6 e1_l1_7 s1_e1_l1_7 s1_e1_l1_7 e1_l1_8 s1_e1_l1_8 s1_e1_l1_8 e1_l1_9 s1_e1_l1_9 s1_e1_l1_9 e1_l1_10 s1_e1_l1_10 s1_e1_l1_10 e1_l1_11 s1_e1_l1_11 s1_e1_l1_11 e1_l1_12 s1_e1_l1_12 s1_e1_l1_12 e1_l1_13 s1_e1_l1_13 s1_e1_l1_13 e1_l1_14 s1_e1_l1_14 s1_e1_l1_14 ============= Test 1.16:117 ============= e1_l1_1 e1_l1_1 e1_l1_2 e1_l1_2 e1_l1_3 e1_l1_3 e1_l1_4 e1_l1_4 e1_l1_5 e1_l1_5 e1_l1_6 e1_l1_6 e1_l1_7 e1_l1_7 e1_l1_8 e1_l1_8 e1_l1_9 e1_l1_9 e1_l1_10 e1_l1_10 e1_l1_11 e1_l1_11 e1_l1_12 e1_l1_12 e1_l1_13 e1_l1_13 e1_l1_14 e1_l1_14 e1_l1_1 e1_l1_1 e1_l1_2 e1_l1_2 e1_l1_3 e1_l1_3 e1_l1_4 e1_l1_4 e1_l1_5 e1_l1_5 e1_l1_6 e1_l1_6 e1_l1_7 e1_l1_7 e1_l1_8 e1_l1_8 e1_l1_9 e1_l1_9 e1_l1_10 e1_l1_10 e1_l1_11 e1_l1_11 e1_l1_12 e1_l1_12 e1_l1_13 e1_l1_13 e1_l1_14 e1_l1_14 ============= Test 1.17:118 ============= l1_1 l1_1 l1_2 l1_2 l1_3 l1_3 l1_4 l1_4 l1_5 l1_5 l1_6 l1_6 l1_7 l1_7 l1_8 l1_8 l1_9 l1_9 l1_10 l1_10 l1_11 l1_11 l1_12 l1_12 l1_13 l1_13 l1_14 l1_14 ============= Test 1.18:119 ============= l1_1 l1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 Testing address ranges ============ Test 2.1:120 ============ l1_4 ============ Test 2.2:121 ============ l2_6 ============ Test 2.3:122 ============ l1_14 ============ Test 2.4:123 ============ l2_9 ============ Test 2.5:124 ============ ============ Test 2.6:125 ============ l2_9 ============ Test 2.7:126 ============ ============ Test 2.9:127 ============ l1_7 ============= Test 2.10:128 ============= l1_7 ============= Test 2.11:129 ============= l1_7 ============= Test 2.12:130 ============= l1_1 l1_2 l1_3 l1_4 ============= Test 2.13:131 ============= l1_1 l1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 l2_1 l2_2 l2_3 l2_4 l2_5 l2_6 l2_7 l2_8 l2_9 ============= Test 2.14:132 ============= l1_1 l1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 l2_1 l2_2 l2_3 l2_4 l2_5 l2_6 l2_7 l2_8 l2_9 ============= Test 2.15:133 ============= l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 l2_1 l2_2 l2_3 l2_4 l2_5 l2_6 l2_7 l2_8 l2_9 ============= Test 2.16:134 ============= l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 l2_1 l2_2 l2_3 l2_4 l2_5 l2_6 ============= Test 2.17:135 ============= l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_14 l2_1 l2_2 l2_3 l2_4 l2_5 l2_6 l2_7 l2_8 l2_9 ============= Test 2.18:136 ============= l2_3 l2_4 l2_5 l2_6 l2_7 l2_8 l2_9 ============= Test 2.19:137 ============= l1_12 ============= Test 2.20:138 ============= l1_7 Brace and other grouping ============ Test 3.1:139 ============ l1_1 l1_2 l1_3 ^l1T4$ ^l1T5$ ^l1T6$ ^l1T7$ ^l1T8$ ^l1T9$ ^l1T10$ ^l1T11$ ^l1T12$ l1_13 l1_14 ============ Test 3.2:140 ============ l1_1 l1_2 l1_3 ^l1_4 ^l1_5 ^l1_6$ ^l1_7$ ^l1T8$ ^l1_9$ ^l1_10$ ^l1_11 ^l1_12 l1_13 l1_14 ============ Test 3.3:141 ============ ^l1T1$ ^l1T2$ ^l1T3$ l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 ^l1T13$ ^l1T14$ ============ Test 3.4:142 ============ ^l1_1 ^l1_2 ^l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 ^l1_13 ^l1_14 Testing a c d and i commands ============ Test 4.1:143 ============ before_il1_1 after_ibefore_il1_1 before_il1_2 after_ibefore_il1_2 before_il1_3 after_ibefore_il1_3 before_il1_4 after_ibefore_il1_4 before_il1_5 after_ibefore_il1_5 before_il1_6 after_ibefore_il1_6 before_il1_7 after_ibefore_il1_7 before_il1_8 after_ibefore_il1_8 before_il1_9 after_ibefore_il1_9 before_il1_10 after_ibefore_il1_10 before_il1_11 after_ibefore_il1_11 before_il1_12 after_ibefore_il1_12 before_il1_13 after_ibefore_il1_13 before_il1_14 after_ibefore_il1_14 before_il2_1 after_ibefore_il2_1 before_il2_2 after_ibefore_il2_2 before_il2_3 after_ibefore_il2_3 before_il2_4 after_ibefore_il2_4 before_il2_5 after_ibefore_il2_5 before_il2_6 inserted after_ibefore_il2_6 before_il2_7 after_ibefore_il2_7 before_il2_8 after_ibefore_il2_8 before_il2_9 after_ibefore_il2_9 ============ Test 4.2:144 ============ before_al1_1 after_abefore_al1_1 before_al1_2 after_abefore_al1_2 before_al1_3 after_abefore_al1_3 before_al1_4 after_abefore_al1_4 before_a5-12l1_5 after_abefore_a5-12l1_5 appended before_a5-12l1_6 after_abefore_a5-12l1_6 appended before_a5-12l1_7 after_abefore_a5-12l1_7 appended before_a5-12l1_8 after_abefore_a5-12l1_8 appended before_a5-12l1_9 after_abefore_a5-12l1_9 appended before_a5-12l1_10 after_abefore_a5-12l1_10 appended before_a5-12l1_11 after_abefore_a5-12l1_11 appended before_a5-12l1_12 after_abefore_a5-12l1_12 appended before_al1_13 after_abefore_al1_13 before_al1_14 after_abefore_al1_14 before_al2_1 after_abefore_al2_1 before_al2_2 after_abefore_al2_2 before_al2_3 after_abefore_al2_3 before_al2_4 after_abefore_al2_4 before_al2_5 after_abefore_al2_5 before_al2_6 after_abefore_al2_6 before_al2_7 after_abefore_al2_7 before_al2_8 after_abefore_al2_8 before_al2_9 after_abefore_al2_9 ============ Test 4.3:145 ============ ^l1_1 ^l1_1$ appended ^l1_2 ^l1_2$ appended ^l1_3 ^l1_3$ appended ^l1_4 ^l1_4$ appended ^l1_5 ^l1_5$ appended ^l1_6 ^l1_6$ appended ^l1_7 ^l1_7$ appended ^l1_8 appended ^l1_8 l1_9$ ^l1_10 appended ^l1_10 l1_11$ ^l1_12 ^l1_12$ appended ^l1_13 ^l1_13$ appended ^l1_14 ^l1_14$ appended ^l2_1 ^l2_1$ ^l2_2 ^l2_2$ ^l2_3 ^l2_3$ ^l2_4 ^l2_4$ ^l2_5 ^l2_5$ ^l2_6 ^l2_6$ ^l2_7 ^l2_7$ ^l2_8 ^l2_8$ ^l2_9 ^l2_9$ ============ Test 4.4:146 ============ hello hello hello hello hello hello hello hello hello hello hello hello hello hello ============ Test 4.5:147 ============ hello ============ Test 4.6:148 ============ hello ============ Test 4.7:149 ============ hello ============ Test 4.8:150 ============ Testing labels and branching ============ Test 5.1:151 ============ label2_l1_1 label3_label2_l1_1 label1_l1_2 label1_l1_3 label1_l1_4 label1_l1_5 label1_l1_6 label1_l1_7 label1_l1_8 label1_l1_9 label1_l1_10 label1_l1_11 label1_l1_12 label2_l1_13 label3_label2_l1_13 label2_l1_14 label3_label2_l1_14 ============ Test 5.2:152 ============ tested l2_1 tested l2_2 tested l2_3 tested l2_4 tested l2_5 tested l2_6 tested l2_7 tested l2_8 tested l2_9 tested l2_10 tested l2_11 tested l2_12 tested l2_13 tested l2_14 ============ Test 5.3:153 ============ ^l1_1 ^l1_1$ ^l1_2 ^l1_2$ ^l1_3 ^l1_3$ ^l1_4 ^l1_4$ l1_5$ l1_6$ l1_7$ l1_8$ ============ Test 5.4:154 ============ ^l1_1$ ^l1_2$ ^l1_3$ ^l1_4$ ^l1_5$ ^l1_6$ ^l1_7$ ^l1_8$ l1_9$ l1_10$ l1_11$ l1_12$ l1_13$ l1_14$ ============ Test 5.5:155 ============ ^l1_1 ^l1_2 ^l1_4 ^l1_6 ^l1_8 ============ Test 5.6:156 ============ l1_1 l1_2 l1_3 l1_4 l1_5 ============ Test 5.7:157 ============ l1_1 l1_2 l1_3 l1_4 hello l1_5 ============ Test 5.8:158 ============ m1_1 m1_2 m1_3 m1_4 m1_5 m1_6 m1_7 m1_8 m1_9 m1_10 m1_11 m1_12 m1_13 m1_14 Pattern space commands ============ Test 6.1:159 ============ changed changed changed changed changed changed changed changed changed changed changed changed changed changed ============ Test 6.2:160 ============ l1_1 l1_2 l1_3 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 ============ Test 6.3:161 ============ l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 ============ Test 6.4:162 ============ l1_1 l1_2 l1_3 l1_2 l1_3 l1_5 l1_2 l1_3 l1_2 l1_3 l1_6 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 ============ Test 6.5:163 ============ l1_1 l1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 ============ Test 6.6:164 ============ Testing print and file routines ============ Test 7.1:165 ============ \001\002\003\004\005\006\a\b\t$ \v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\ \035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX\ YZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\ \206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\ \227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\ \250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\ \271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\ \312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\ \333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\ \354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\ \375\376\377$ $ ============ Test 7.2:166 ============ l1_1 l1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 15 l2_1 16 l2_2 17 l2_3 18 l2_4 19 l2_5 20 l2_6 21 l2_7 22 l2_8 23 l2_9 ============ Test 7.3:167 ============ l1_1 l1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 w results l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 ============ Test 7.4:168 ============ l1_1 l1_2 l1_3 l1_4 l2_1 l2_2 l2_3 l2_4 l2_5 l2_6 l2_7 l2_8 l2_9 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 ============ Test 7.5:169 ============ l1_1 l1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 ============ Test 7.6:170 ============ l1_1 l1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 ============ Test 7.8:171 ============ Testing substitution commands ============ Test 8.1:172 ============ XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXXX XXXXX XXXXX XXXXX XXXXX ============ Test 8.2:173 ============ XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXXX XXXXX XXXXX XXXXX XXXXX ============ Test 8.3:174 ============ XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXXX XXXXX XXXXX XXXXX XXXXX ============ Test 8.4:175 ============ l1_1 l1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 ============ Test 8.5:176 ============ l1X1 l1X2 l1X3 l1X4 l1X5 l1X6 l1X7 l1X8 l1X9 l1X10 l1X11 l1X12 l1X13 l1X14 ============ Test 8.6:177 ============ (l)(1)(_)(1) (l)(1)(_)(2) (l)(1)(_)(3) (l)(1)(_)(4) (l)(1)(_)(5) (l)(1)(_)(6) (l)(1)(_)(7) (l)(1)(_)(8) (l)(1)(_)(9) (l)(1)(_)(1)(0) (l)(1)(_)(1)(1) (l)(1)(_)(1)(2) (l)(1)(_)(1)(3) (l)(1)(_)(1)(4) ============ Test 8.7:178 ============ (&)(&)(&)(&) (&)(&)(&)(&) (&)(&)(&)(&) (&)(&)(&)(&) (&)(&)(&)(&) (&)(&)(&)(&) (&)(&)(&)(&) (&)(&)(&)(&) (&)(&)(&)(&) (&)(&)(&)(&)(&) (&)(&)(&)(&)(&) (&)(&)(&)(&)(&) (&)(&)(&)(&)(&) (&)(&)(&)(&)(&) ============ Test 8.8:179 ============ x_x1xl1 x_x1xl2 x_x1xl3 x_x1xl4 x_x1xl5 x_x1xl6 x_x1xl7 x_x1xl8 x_x1xl9 x_x1xl10 x_x1xl11 x_x1xl12 x_x1xl13 x_x1xl14 ============ Test 8.9:180 ============ l1u0 u1 u21 l1u0 u1 u22 l1u0 u1 u23 l1u0 u1 u24 l1u0 u1 u25 l1u0 u1 u26 l1u0 u1 u27 l1u0 u1 u28 l1u0 u1 u29 l1u0 u1 u210 l1u0 u1 u211 l1u0 u1 u212 l1u0 u1 u213 l1u0 u1 u214 ============= Test 8.10:181 ============= l1_X l1_X l1_X l1_X l1_X l1_X l1_X l1_X l1_X l1_X0 l1_X1 l1_X2 l1_X3 l1_X4 ============= Test 8.11:182 ============= lX_1 lX_2 lX_3 lX_4 lX_5 lX_6 lX_7 lX_8 lX_9 lX_10 lX_11 lX_12 lX_13 lX_14 s wfile results lX_1 lX_2 lX_3 lX_4 lX_5 lX_6 lX_7 lX_8 lX_9 lX_10 lX_11 lX_12 lX_13 lX_14 ============= Test 8.12:183 ============= lX_X lX_X lX_X lX_4 lX_5 lX_6 lX_7 lX_8 lX_9 lX_X0 lX_XX lX_XX lX_XX lX_X4 ============= Test 8.13:184 ============= l8_8 l8_7 l8_6 l8_5 l8_4 l8_3 l8_2 l8_1 l8_0 l8_89 l8_88 l8_87 l8_86 l8_85 ============= Test 8.14:185 ============= l8_8 l8_7 l8_6 l8_5 l8_4 l8_3 l8_2 l8_1 l8_0 l8_89 l8_88 l8_87 l8_86 l8_85 ============= Test 8.15:186 ============= l1_1Xl1_2 l1_3 l1_4 l1_5 l1_6 l1_7 l1_8 l1_9 l1_10 l1_11 l1_12 l1_13 l1_14 ============= Test 8.16:187 ============= eeefff Xeefff XYefff XYeYff XYeYYf XYeYYY XYeYYY sed-3.62/testsuite/bsd.sh0000755000076600007660000002261710143133572012323 00000000000000#!/bin/sh - # $NetBSD: sed.test,v 1.3 1997/01/09 20:21:37 tls Exp $ # # Copyright (c) 1992 Diomidis Spinellis. # Copyright (c) 1992, 1993 # The Regents of the University of California. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # from: @(#)sed.test 8.1 (Berkeley) 6/6/93 # $NetBSD: sed.test,v 1.3 1997/01/09 20:21:37 tls Exp $ # # sed Regression Tests # Modified by Paolo Bonzini to: # - not warn about buggy seds # - run tests once instead of comparing them to the system sed # - remove most uses of awk # - cleanup at exit # - comment tests that broke because of extensions main() { TEST="${1-../sed/sed}" TESTLOG="${2-sed.out}" # DICT="${3-/usr/share/dict/words}" : > lines1 : > lines2 for i in 1 2 3 4 5 6 7 8 9; do echo l1_$i >> lines1 echo l2_$i >> lines2 done for i in 10 11 12 13 14; do echo l1_$i >> lines1 done # Set these flags to get messages about known problems tests "$TEST" "$TESTLOG" rm -f lines[1234] script[12] } tests() { SED="$1" LOG="$2" MARK=100 rm -f "$LOG" exec 3>&0 4>&1 5>&2 exec 0/dev/null 2>/dev/null test_error exec 0>&3 1>&4 2>&5 exec 4>&1 5>&2 test_args test_addr test_group test_acid test_branch test_pattern test_print test_subst exec 1>&4 2>&5 } mark() { exec 2>&1 >>$LOG test $MARK = 100 || echo MARK=`expr $MARK + 1` echo "Test $1:$MARK" | sed 's/./=/g' echo "Test $1:$MARK" echo "Test $1:$MARK" | sed 's/./=/g' } test_args() { mark '1.1' echo Testing argument parsing echo First type $SED 's/^/e1_/p' lines1 mark '1.2' ; $SED -n 's/^/e1_/p' lines1 mark '1.3' ; $SED 's/^/e1_/p' script1 echo 's/^/s2_/p' >script2 mark '1.5' ; $SED -f script1 lines1 mark '1.6' ; $SED -f script1 script1 <lines3 mark '7.1' ; $SED -n l lines3 mark '7.2' ; $SED -e '/l2_/=' lines1 lines2 rm -f lines4 mark '7.3' ; $SED -e '3,12w lines4' lines1 echo w results cat lines4 mark '7.4' ; $SED -e '4r lines2' lines1 mark '7.5' ; $SED -e '5r /dev/dds' lines1 mark '7.6' ; $SED -e '6r /dev/null' lines1 # mark '7.7' # sed '200q' $DICT | sed 's$.*$s/^/&/w tmpdir/&$' >script1 # rm -rf tmpdir # mkdir tmpdir # $SED -f script1 lines1 # cat tmpdir/* # rm -rf tmpdir mark '7.8' echo line1 > lines3 echo "" >> lines3 $SED -n -e '$p' lines3 /dev/null } test_subst() { echo Testing substitution commands mark '8.1' ; $SED -e 's/./X/g' lines1 mark '8.2' ; $SED -e 's,.,X,g' lines1 mark '8.3' ; $SED -e 's.\..X.g' lines1 # POSIX does not say that this should work # mark '8.4' ; $SED -e 's/[/]/Q/' lines1 mark '8.4' ; $SED -e 's/[\/]/Q/' lines1 mark '8.5' ; $SED -e 's_\__X_' lines1 mark '8.6' ; $SED -e 's/./(&)/g' lines1 mark '8.7' ; $SED -e 's/./(\&)/g' lines1 mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' lines1 mark '8.9' ; $SED -e 's/_/u0\ u1\ u2/g' lines1 mark '8.10' ; $SED -e 's/./X/4' lines1 rm -f lines4 mark '8.11' ; $SED -e 's/1/X/w lines4' lines1 echo s wfile results cat lines4 mark '8.12' ; $SED -e 's/[123]/X/g' lines1 mark '8.13' ; $SED -e 'y/0123456789/9876543210/' lines1 mark '8.14' ; $SED -e 'y10\123456789198765432\101' lines1 mark '8.15' ; $SED -e '1N;2y/\n/X/' lines1 mark '8.16' echo 'eeefff' | $SED -e 'p' -e 's/e/X/p' -e ':x' \ -e 's//Y/p' -e '/f/bx' } test_error() { $SED -x && exit 1 $SED -f && exit 1 $SED -e && exit 1 $SED -f /dev/dds && exit 1 $SED p /dev/dds && exit 1 $SED -f /bin/sh && exit 1 $SED '{' && exit 1 $SED '{' && exit 1 $SED '/hello/' && exit 1 $SED '1,/hello/' && exit 1 $SED -e '-5p' && exit 1 $SED '/jj' && exit 1 # $SED 'a hello' && exit 1 # $SED 'a \ hello' && exit 1 $SED 'b foo' && exit 1 $SED 'd hello' && exit 1 $SED 's/aa' && exit 1 $SED 's/aa/' && exit 1 $SED 's/a/b' && exit 1 $SED 's/a/b/c/d' && exit 1 $SED 's/a/b/ 1 2' && exit 1 # $SED 's/a/b/ 1 g' && exit 1 $SED 's/a/b/w' && exit 1 $SED 'y/aa' && exit 1 $SED 'y/aa/b/' && exit 1 $SED 'y/aa/' && exit 1 $SED 'y/a/b' && exit 1 $SED 'y/a/b/c/d' && exit 1 $SED '!' && exit 1 $SED supercalifrangolisticexprialidociussupercalifrangolisticexcius } main ${1+"$@"} sed-3.62/testsuite/classes.good0000644000076600007660000000023110143133572013507 00000000000000: ${_cv_='emptyvar'} : ${ac_cv_prog/RANLIB='/usr/bin/ranlib'} : ${ac_cv_prog/CC='/usr/unsupported/\ \ /lib/_cv_/cc'} : ${a/c_cv_prog/CPP='/usr/bin/cpp'} sed-3.62/testsuite/classes.inp0000644000076600007660000000022510143133572013350 00000000000000_cv_=emptyvar ac_cv_prog/RANLIB=/usr/bin/ranlib ac_cv_prog/CC=/usr/unsupported/\ \ /lib/_cv_/cc a/c_cv_prog/CPP=/usr/bin/cpp SHELL=bash GNU=GNU!UNIX sed-3.62/testsuite/classes.sed0000644000076600007660000000021310143133572013332 00000000000000# inspired by an autoconf generated configure script. s/^\([/[:lower:]A-Z0-9]*_cv_[[:lower:][:upper:]/[:digit:]]*\)=\(.*\)/: \${\1='\2'}/p sed-3.62/testsuite/cv-vars.good0000644000076600007660000000023010143133572013432 00000000000000: ${_cv_='emptyvar'} : ${ac_cv_prog_RANLIB='/usr/bin/ranlib'} : ${ac_cv_prog_CC='/usr/unsupported/\ \ /lib/_cv_/cc'} : ${ac_cv_prog_CPP='/usr/bin/cpp'} sed-3.62/testsuite/cv-vars.inp0000644000076600007660000000022410143133572013273 00000000000000_cv_=emptyvar ac_cv_prog_RANLIB=/usr/bin/ranlib ac_cv_prog_CC=/usr/unsupported/\ \ /lib/_cv_/cc ac_cv_prog_CPP=/usr/bin/cpp SHELL=bash GNU=GNU!UNIX sed-3.62/testsuite/cv-vars.sed0000644000076600007660000000016310143133572013262 00000000000000# inspired by an autoconf generated configure script. s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/: \${\1='\2'}/p sed-3.62/testsuite/dc.good0000644000076600007660000000003110143133572012436 0000000000000031 March 2002 1.6A09E667Ased-3.62/testsuite/dc.inp0000644000076600007660000000052410143133572012303 00000000000000# Compute Easter of 2002... # usage: (echo YEAR; cat easter.dc) | dc 2002 [ddsf[lfp[too early ]Pq]s@1583>@ ddd19%1+sg100/1+d3*4/12-sx8*5+25/5-sz5*4/lx-10-sdlg11*20+lz+lx-30% d[30+]s@0>@d[[1+]s@lg11<@]s@25=@d[1+]s@24=@se44le-d[30+]s@21>@dld+7%-7+ [March ]smd[31-[April ]sm]s@31<@psnlmPpsn1z>p]splpx # Compute square root of 2 16oAk2vpqsed-3.62/testsuite/dc.sed0000644000076600007660000002106610143133572012274 00000000000000#!/bin/sed -nf # dc.sed - an arbitrary precision RPN calculator # Created by Greg Ubben early 1995, late 1996 # # Dedicated to MAC's memory of the IBM 1620 ("CADET") computer. # @(#)GSU dc.sed 1.1 06-Mar-1999 [non-explanatory] # # Examples: # sqrt(2) to 10 digits: echo "10k 2vp" | dc.sed # 20 factorial: echo "[d1-d1 != fractional-bases # SunOS limits: 199/199 commands (though could pack in 10-20 more) # Limitations: scale <= 999; |obase| >= 1; input digits in [0..F] # Completed: 1am Feb 4, 1997 s/^/|P|K0|I10|O10|?~/ : next s/|?./|?/ s/|?#[ -}]*/|?/ /|?!*[lLsS;:<>=]\{0,1\}$/N /|?!*[-+*/%^<>=]/b binop /^|.*|?[dpPfQXZvxkiosStT;:]/b binop /|?[_0-9A-F.]/b number /|?\[/b string /|?l/b load /|?L/b Load /|?[sS]/b save /|?c/ s/[^|]*// /|?d/ s/[^~]*~/&&/ /|?f/ s//&[pSbz0}s\1L\1l{xS\1]dS{xL}/ /|?:/ s/|?:\([^{}]\)/|?~[s}L{s}L{s}L}s\1q]S}S}S{[L}1-d0>}S}l\1s\1L\1l{xS\1]dS{x/ /|?[ ~ cdfxKIOT]/b next /|?\n/b next /|?[pP]/b print /|?k/ s/^\([0-9]\{1,3\}\)\([.~].*|K\)[^|]*/\2\1/ /|?i/ s/^\(-\{0,1\}[0-9]*\.\{0,1\}[0-9]\{1,\}\)\(~.*|I\)[^|]*/\2\1/ /|?o/ s/^\(-\{0,1\}[1-9][0-9]*\.\{0,1\}[0-9]*\)\(~.*|O\)[^|]*/\2\1/ /|?[kio]/b pop /|?t/b trunc /|??/b input /|?Q/b break /|?q/b quit h /|?[XZz]/b count /|?v/b sqrt s/.*|?\([^Y]\).*/\1 is unimplemented/ s/\n/\\n/g l g b next : print /^-\{0,1\}[0-9]*\.\{0,1\}[0-9]\{1,\}~.*|?p/!b Print /|O10|/b Print # Print a number in a non-decimal output base. Uses registers a,b,c,d. # Handles fractional output bases (O<-1 or O>=1), unlike other dc's. # Converts the fraction correctly on negative output bases, unlike # UNIX dc. Also scales the fraction more accurately than UNIX dc. # s,|?p,&KSa0kd[[-]Psa0la-]Sad0>a[0P]sad0=a[A*2+]saOtd0>a1-ZSd[[[[ ]P]sclb1\ !=cSbLdlbtZ[[[-]P0lb-sb]sclb0>c1+]sclb0!c]scdld>cscSdLbP]q]Sb\ [t[1P1-d0bO1!c[A]sbdA=c[B]sbd\ B=c[C]sbdC=c[D]sbdD=c[E]sbdE=c[F]sb]xscLbP]~Sd[dtdZOZ+k1O/Tdsb[.5]*[.1]O\ X^*dZkdXK-1+ktsc0kdSb-[Lbdlb*lc+tdSbO*-lb0!=aldx]dsaxLbsb]sad1!>a[[.]POX\ +sb1[SbO*dtdldx-LbO*dZlb!]\)/0\1/ /^[^~]*~-\{0,1\}[0-9]*\.\{0,1\}[0-9]\{1,\}~/ !s/~[^~]*\(.*|?!*[^!=<>]\)/~0\1/ h /|?\*/b mul /|?\//b div /|?%/b rem /|?^/b exp /|?[+-]/ s/^\(-*\)\([^~]*~\)\(-*\)\([^~]*~\).*|?\(-\{0,1\}\).*/\2\4s\3o\1\3\5/ s/\([^.~]*\)\([^~]*~[^.~]*\)\(.*\)/<\1,\2,\3|=-~.0,123456789<>/ /|?/{ s/^\([<>]\)\(-[^~]*~-.*\1\)\(.\)/\3\2/ s/^\(.\)\(.*|?!*\)\1/\2!\1/ s/|?![^!]\(.\)/&l\1x/ s/[^~]*~[^~]*~\(.*|?\)!*.\(.*\)|=.*/\1\2/ b next } s/\(-*\)\1|=.*/;9876543210;9876543210/ /o-/ s/;9876543210/;0123456789/ s/^>\([^~]*~\)\([^~]*~\)s\(-*\)\(-*o\3\(-*\)\)/>\2\1s\5\4/ s/,\([0-9]*\)\.*\([^,]*\),\([0-9]*\)\.*\([0-9]*\)/\1,\2\3.,\4;0/ : right1 s/,\([0-9]\)\([^,]*\),;*\([0-9]\)\([0-9]*\);*0*/\1,\2\3,\4;0/ t right1 s/.\([^,]*\),~\(.*\);0~s\(-*\)o-*/\1~\30\2~/ : addsub1 s/\(.\{0,1\}\)\(~[^,]*\)\([0-9]\)\(\.*\),\([^;]*\)\(;\([^;]*\(\3[^;]*\)\).*X*\1\(.*\)\)/\2,\4\5\9\8\7\6/ s/,\([^~]*~\).\{10\}\(.\)[^;]\{0,9\}\([^;]\{0,1\}\)[^;]*/,\2\1\3/ # could be done in one s/// if we could have >9 back-refs... /^~.*~;/!b addsub1 : endbin s/.\([^,]*\),\([0-9.]*\).*/\1\2/ G s/\n[^~]*~[^~]*// : normal s/^\(-*\)0*\([0-9.]*[0-9]\)[^~]*/\1\2/ s/^[^1-9~]*~/0~/ b next : mul s/\(-*\)\([0-9]*\)\.*\([0-9]*\)~\(-*\)\([0-9]*\)\.*\([0-9]*\).*|K\([^|]*\).*/\1\4\2\5.!\3\6,|\2<\3~\5>\6:\7;9876543210009909/ : mul1 s/![0-9]\([^<]*\)<\([0-9]\{0,1\}\)\([^>]*\)>\([0-9]\{0,1\}\)/0!\1\2<\3\4>/ /![0-9]/ s/\(:[^;]*\)\([1-9]\)\(0*\)\([^0]*\2\(.\).*X*\3\(9*\)\)/\1\5\6\4/ /<~[^>]*>:0*;/!t mul1 s/\(-*\)\1\([^>]*\).*/;\2^>:9876543210aaaaaaaaa/ : mul2 s/\([0-9]~*\)^/^\1/ s/<\([0-9]*\)\(.*[~^]\)\([0-9]*\)>/\1<\2>\3/ : mul3 s/>\([0-9]\)\(.*\1.\{9\}\(a*\)\)/\1>\2;9\38\37\36\35\34\33\32\31\30/ s/\(;[^<]*\)\([0-9]\)<\([^;]*\).*\2[0-9]*\(.*\)/\4\1<\2\3/ s/a[0-9]/a/g s/a\{10\}/b/g s/b\{10\}/c/g /|0*[1-9][^>]*>0*[1-9]/b mul3 s/;/a9876543210;/ s/a.\{9\}\(.\)[^;]*\([^,]*\)[0-9]\([.!]*\),/\2,\1\3/ y/cb/ba/ /|<^/!b mul2 b endbin : div # CDDET /^[-.0]*[1-9]/ !i\ divide by 0 //!b pop s/\(-*\)\([0-9]*\)\.*\([^~]*~-*\)\([0-9]*\)\.*\([^~]*\)/\2.\3\1;0\4.\5;0/ : div1 s/^\.0\([^.]*\)\.;*\([0-9]\)\([0-9]*\);*0*/.\1\2.\3;0/ s/^\([^.]*\)\([0-9]\)\.\([^;]*;\)0*\([0-9]*\)\([0-9]\)\./\1.\2\30\4.\5/ t div1 s/~\(-*\)\1\(-*\);0*\([^;]*[0-9]\)[^~]*/~123456789743222111~\2\3/ s/\(.\(.\)[^~]*\)[^9]*\2.\{8\}\(.\)[^~]*/\3~\1/ s,|?.,&SaSadSaKdlaZ+LaX-1+[sb1]Sbd1>bkLatsbLa[dSa2lbla*-*dLa!=a]dSaxsakLasbLb*t, b next : rem s,|?%,&Sadla/LaKSa[999]k*Lak-, b next : exp # This decimal method is just a little faster than the binary method done # totally in dc: 1LaKLb [kdSb*LbK]Sb [[.5]*d0ktdSaa[dk]sadKa]dsaxsasaLbsaLatLbk K1-kt, b next # END OF GSU dc.sed sed-3.62/testsuite/distrib.good0000644000076600007660000000204310143133572013515 00000000000000Path: mailnewsgateway From crash@cygnus.com Wed Mar 8 18: 02:42 1995 From: crash@cygnus.com (Jason Molenda) Message-ID: <9503090202.AA06931.alt.buddha.fat.short.guy@phydeaux.cygnus.com> Subject: Note for sed testsuite Original-To: molenda@msi.umn.edu Date: Wed, 8 Mar 1995 18:02:24 -0800 (PST) X-Mailer: ELM [version 2.4 PL23] Newsgroups: alt.buddha.short.fat.guy Distribution: world Sender: news@cygnus.com Approved: alt.buddha.short.fat.guy@cygnus.com _Summum Bonum_ All the breath and the bloom of the year in the bag of one bee: All the wonder and wealth of the mine in the heart of one gem: In the core of one pearl all the shade and the shine of the sea: Breath and bloom, shade and shine, -- wonder, wealth, and -- how far above them -- Truth, thats brighter than gem, Trust, that's purer than pearl, -- Brightest truth, purest trust in the universe -- all were for me In the kiss of one girl. -- Robert Browning sed-3.62/testsuite/distrib.inp0000644000076600007660000000272310143133572013360 00000000000000From crash@cygnus.com Wed Mar 8 18:02:42 1995 Received: from s1.msi.umn.edu (s1.msi.umn.edu [128.101.24.1]) by cygnus.com (8.6.9/8.6.9) with ESMTP id SAA21692 for ; Wed, 8 Mar 1995 18:02:41 -0800 Received: from cygint.cygnus.com (cygint.cygnus.com [140.174.1.1]) by s1.msi.umn.edu (8.6.10/8.6.9) with ESMTP id TAA13398 for ; Wed, 8 Mar 1995 19:59:18 -0600 Received: from phydeaux.cygnus.com (phydeaux.cygnus.com [140.174.1.85]) by cygnus.com (8.6.9/8.6.9) with SMTP id SAA21688 for ; Wed, 8 Mar 1995 18:02:33 -0800 From: Jason Molenda Received: by phydeaux.cygnus.com (5.65/4.7) id AA06931; Wed, 8 Mar 1995 18:02:28 -0800 Message-Id: <9503090202.AA06931@phydeaux.cygnus.com> Subject: Note for sed testsuite To: molenda@msi.umn.edu Date: Wed, 8 Mar 1995 18:02:24 -0800 (PST) X-Mailer: ELM [version 2.4 PL23] _Summum Bonum_ All the breath and the bloom of the year in the bag of one bee: All the wonder and wealth of the mine in the heart of one gem: In the core of one pearl all the shade and the shine of the sea: Breath and bloom, shade and shine, -- wonder, wealth, and -- how far above them -- Truth, thats brighter than gem, Trust, that's purer than pearl, -- Brightest truth, purest trust in the universe -- all were for me In the kiss of one girl. -- Robert Browning sed-3.62/testsuite/distrib.sed0000644000076600007660000000272010143133572013342 00000000000000# This is straight out of C News # # # All this does is massage the headers so they look like what news # software expects. To:, Cc: and Resent-*: headers are masked. # Reply-To: is turned into references, which is questionable (could # just as well be dropped. # # The From: line is rewritten to use the "address (comments)" form # instead of "phrase " form our mailer uses. Also, addresses # with no "@domainname" are assumed to originate locally, and so are # given a domain. # # The Sender: field below reflects the address of the person who # maintains our mailing lists. The Approved: field is in a special # form, so that we can do bidirectional gatewaying. Any message # in a newsgroup that bears this stamp will not be fed into the # matching mailing list. 1i\ Path: mailnewsgateway :a /^[Rr]eceived:/b r /^[Nn]ewsgroups:/b r /^[Pp]ath:/b r /^[Tt][Oo]:/s/^/Original-/ /^[Cc][Cc]:/s/^/Original-/ /^[Rr][Ee][Ss][Ee][Nn][Tt]-.*/s/^/Original-/ /^[Mm][Ee][Ss][Ss][Aa][Gg][Ee]-[Ii][Dd]:/s/@/.alt.buddha.fat.short.guy@/ s/^[Ii]n-[Rr]eply-[Tt]o:/References:/ /^From:/{ s/<\([^@]*\)>$/<\1@$thissite>/ s/^From:[ ][ ]*\(.*\) *<\(.*\)>$/From: \2 (\1)/ } s/-[Ii]d:/-ID:/ s/^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]:[ ]*$/Subject: (none)/ s/^\([^:]*:\)[ ]*/\1 / /^$/{i\ Newsgroups: alt.buddha.short.fat.guy\ Distribution: world\ Sender: news@cygnus.com\ Approved: alt.buddha.short.fat.guy@cygnus.com b e } p n b a :r s/.*//g n /^[ ]/b r b a :e p n b e sed-3.62/testsuite/distrib.sh0000644000076600007660000000301510143133572013177 00000000000000#! /bin/sh # # This is stolen from C News # # # All this does is massage the headers so they look like what news # software expects. To:, Cc: and Resent-*: headers are masked. # Reply-To: is turned into references, which is questionable (could # just as well be dropped. # # The From: line is rewritten to use the "address (comments)" form # instead of "phrase " form our mailer uses. Also, addresses # with no "@domainname" are assumed to originate locally, and so are # given a domain. # # The Sender: field below reflects the address of the person who # maintains our mailing lists. The Approved: field is in a special # form, so that we can do bidirectional gatewaying. Any message # in a newsgroup that bears this stamp will not be fed into the # matching mailing list. sed=${1-sed} $sed -n -e "1{i\\ Path: mailnewsgateway }" \ -e ":a /^[Rr]eceived:/b r /^[Nn]ewsgroups:/b r /^[Pp]ath:/b r /^[Tt][Oo]:/s/^/Original-/ /^[Cc][Cc]:/s/^/Original-/ /^[Rr][Ee][Ss][Ee][Nn][Tt]-.*/s/^/Original-/ /^[Mm][Ee][Ss][Ss][Aa][Gg][Ee]-[Ii][Dd]:/s/@/.alt.buddha.fat.short.guy@/ s/^[Ii]n-[Rr]eply-[Tt]o:/References:/ /^From:/{ s/<\([^@]*\)>\$/<\1@$thissite>/ s/^From:[ ][ ]*\(.*\) *<\(.*\)>\$/From: \2 (\1)/ } s/-[Ii]d:/-ID:/ s/^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]:[ ]*$/Subject: (none)/ s/^\([^:]*:\)[ ]*/\1 / /^\$/{i\\ Newsgroups: alt.buddha.short.fat.guy\\ Distribution: world\\ Sender: news@cygnus.com\\ Approved: alt.buddha.short.fat.guy@cygnus.com b e } p n b a :r s/.*//g n /^[ ]/b r b a :e p n b e" sed-3.62/testsuite/dollar.good0000644000076600007660000000016410143133572013334 00000000000000I can't quite remember where I heard it, but I can't seem to get out of my head the phrase space the final frontier sed-3.62/testsuite/dollar.inp0000644000076600007660000000015610143133572013173 00000000000000I can't quite remember where I heard it, but I can't seem to get out of my head the phrase the final frontier sed-3.62/testsuite/dollar.sed0000644000076600007660000000001510143133572013152 00000000000000$s/^/space / sed-3.62/testsuite/empty.good0000644000076600007660000000000310143133572013205 00000000000000x sed-3.62/testsuite/empty.inp0000644000076600007660000000000310143133572013043 00000000000000x sed-3.62/testsuite/empty.sed0000644000076600007660000000001010143133572013026 00000000000000s/^ *// sed-3.62/testsuite/enable.good0000644000076600007660000000005410143133572013303 00000000000000targets x11-testing wollybears-in-minnesota sed-3.62/testsuite/enable.inp0000644000076600007660000000016510143133572013144 00000000000000--enable-targets=sparc-sun-sunos4.1.3,srec --enable-x11-testing=on --enable-wollybears-in-minnesota=yes-id-like-that sed-3.62/testsuite/enable.sed0000644000076600007660000000011410143133572013123 00000000000000# inspired by an autoconf generated configure script. s/-*enable-//;s/=.*// sed-3.62/testsuite/eval.good0000644000076600007660000000063110143133572013005 00000000000000abcd --- abcd --- abcd --- 17380: 2 2 5 11 79 cpu --- 17380: 2 2 5 11 79 cpu --- 17380: 2 2 5 11 79 cpu --- abcd --- abcd --- abcd --- 17380: 2 2 5 11 79 cpu --- 17380: 2 2 5 11 79 cpu --- 17380: 2 2 5 11 79 cpu --- Doing some more tests ----------------------- 17380: 2 2 5 11 79 --- ../sed/sed 1q eval.in2 --- 17380: 2 2 5 11 79 --- ../sed/sed 1q eval.in2 --- ../sed/sed 1q eval.in2 sed-3.62/testsuite/eval.inp0000644000076600007660000000005510143133572012643 0000000000000017380: 2 2 5 11 79 abcd cpu abcd cpu sed-3.62/testsuite/eval.sed0000644000076600007660000000073210143133572012632 000000000000001d #Try eval command /cpu/!b2 e../sed/sed 1q eval.in2 :2 p i--- h #Try eval option s,.* *cpu *,../sed/sed 1q eval.in2; echo "&",e :3 p g i--- h #Try eval option with print s,.* *cpu.*,../sed/sed 1q eval.in2,ep g :4 p i--- $!d #Do some more tests s/.*/Doing some more tests -----------------------/p s,.*,../sed/sed 1q eval.in2,ep i--- s,.*,../sed/sed 1q eval.in2,pe i--- s,.*,../sed/sed 1q eval.in2, h e p g i--- s/^/echo /ep i--- s/^fubar$/echo wozthis/e sed-3.62/testsuite/factor.good0000644000076600007660000000004110143133572013327 000000000000002 3 2 2 5 2 2 2 11 2 2 2 2 13 11 sed-3.62/testsuite/factor.inp0000644000076600007660000000002410143133572013166 000000000000002 3 4 5 8 11 16 143 sed-3.62/testsuite/factor.sed0000644000076600007660000000242610143133572013163 00000000000000#! /bin/sed -nf s/.*/&;9aaaaaaaaa8aaaaaaaa7aaaaaaa6aaaaaa5aaaaa4aaaa3aaa2aa1a0/ :encode s/\(a*\)\([0-9]\)\([0-9]*;.*\2\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4\3/ tencode s/;.*// # Compute a few common factors for speed. Clear the subst flag t7a # These are placed here to make the flow harder to understand :-) :2 a\ 2 b2a :3 a\ 3 b3a :5 a\ 5 b5a :7 a\ 7 :7a s/^\(aa*\)\1\{6\}$/\1/ t7 :5a s/^\(aa*\)\1\{4\}$/\1/ t5 :3a s/^\(aa*\)\1\1$/\1/ t3 :2a s/^\(aa*\)\1$/\1/ t2 /^a$/b # The quotient of dividing by 11 is a limit to the remaining prime factors s/^\(aa*\)\1\{10\}/\1=&/ # Pattern space looks like CANDIDATE\nNUMBER. When a candidate is valid, # the number is divided and the candidate is tried again :factor /^\(a\{7,\}\)=\1\1*$/! { # Decrement CANDIDATE, and search again if it is still >1 s/^a// /^aa/b factor # Print the last remaining factor: since it is stored in the NUMBER # rather than in the CANDIDATE, swap 'em: now NUMBER=1 s/\(.*\)=\(.*\)/\2=\1/ } # We have a prime factor in CANDIDATE! Print it h s/=.*/;;0a1aa2aaa3aaaa4aaaaa5aaaaaa6aaaaaaa7aaaaaaaa8aaaaaaaaa9/ :decode s/^\(a*\)\1\{9\}\(a\{0,9\}\)\([0-9]*;.*[^a]\2\([0-9]\)\)/\1\4\3/ /^a/tdecode s/;.*//p g :divide s/^\(a*\)\(=b*\)\1/\1\2b/ tdivide y/b/a/ # If NUMBER = 1, we don't have any more factors /aa$/bfactor sed-3.62/testsuite/fasts.good0000644000076600007660000000037210143133572013200 00000000000000aaaaaabbbbbbaaaaaaa bbbbbb aaaaaabbbbbbaaaaaaa aaaaaabbbbbbaaaaaaa aaaaaaabbbbbbaaaaaaa aaaaaabbbbbbaaaaaaa aaaaaaabbbbbbaaaaaa bbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbb sed-3.62/testsuite/fasts.inp0000644000076600007660000000002510143133572013031 00000000000000aaaaaaabbbbbbaaaaaaa sed-3.62/testsuite/fasts.sed0000644000076600007660000000031510143133572013020 00000000000000# test `fast' substitutions h s/a// p g s/a//g p g s/^a//p g s/^a//g p g s/not present//g p g s/^[a-z]//g p g s/a$// p g y/a/b/ h s/b// p g s/b//g p g s/^b//p g s/^b//g p g s/^[a-z]//g p g s/b$// p g sed-3.62/testsuite/flipcase.good0000644000076600007660000000241210143133572013643 0000000000000009 - 02 - 2002 00.00 Tg La7 La7 - 09 - 02 - 2002 00.00 Brand New Tmc 2 - 09 - 02 - 2002 00.10 Tg1 Notte Rai Uno - 09 - 02 - 2002 00.15 Tg Parlamento Rai Due - 09 - 02 - 2002 00.15 Kung Fu - La Leggenda Continua La7 - 09 - 02 - 2002 00.20 Berserk - La Confessione Di Gatz Italia 1 Cartoon 09 - 02 - 2002 00.20 Tg3 - Tg3 Meteo Rai Tre - 09 - 02 - 2002 00.25 Meteo 2 Rai Due - 09 - 02 - 2002 00.30 Appuntamento Al Cinema Rai Due - 09 - 02 - 2002 00.30 Rai Educational - Mediamente Rai Tre - 09 - 02 - 2002 00.35 Profiler Rai Due - 09 - 02 - 2002 00.35 Stampa Oggi - Che Tempo Fa Rai Uno - 09 - 02 - 2002 00.45 Rai Educational - Babele: Euro Rai Uno - 09 - 02 - 2002 00.45 Bollettino Della Neve Rete 4 News 09 - 02 - 2002 00.50 Studio Aperto - La Giornata Italia 1 News 09 - 02 - 2002 00.50 Bocca A Bocca - 2 Tempo Rete 4 Film 09 - 02 - 2002 01.00 Appuntamento Al Cinema Rai Tre - 09 - 02 - 2002 01.00 Music Non Stop Tmc 2 - 09 - 02 - 2002 01.00 Studio Sport Italia 1 Sport 09 - 02 - 2002 01.00 Tg 5 - Notte Canale 5 News 09 - 02 - 2002 01.05 Fuori Orario. Cose (Mai) Viste Rai Tre - 09 - 02 - 2002 01.15 Rainotte Rai Due - 09 - 02 - 2002 01.15 Sottovoce Rai Uno - 09 - 02 - 2002 01.15 Giochi Olimpici Invernali - Cerimonia Di Apertura Rai Tre - 09 - 02 - 2002 01.17 Italia Interroga Rai Due - sed-3.62/testsuite/flipcase.inp0000644000076600007660000000241210143133572013501 0000000000000009 - 02 - 2002 00.00 Tg La7 La7 - 09 - 02 - 2002 00.00 Brand New Tmc 2 - 09 - 02 - 2002 00.10 Tg1 Notte Rai Uno - 09 - 02 - 2002 00.15 Tg Parlamento Rai Due - 09 - 02 - 2002 00.15 Kung Fu - La Leggenda Continua La7 - 09 - 02 - 2002 00.20 Berserk - La CoNFESSIONE Di Gatz Italia 1 Cartoon 09 - 02 - 2002 00.20 Tg3 - Tg3 Meteo Rai TrE - 09 - 02 - 2002 00.25 Meteo 2 Rai Due - 09 - 02 - 2002 00.30 Appuntamento Al CinEMA RaI Due - 09 - 02 - 2002 00.30 Rai Educational - Mediamente Rai Tre - 09 - 02 - 2002 00.35 Profiler Rai Due - 09 - 02 - 2002 00.35 Stampa OggI - Che Tempo Fa Rai Uno - 09 - 02 - 2002 00.45 Rai Educational - Babele: Euro Rai Uno - 09 - 02 - 2002 00.45 BollettINO Della NEVE RETE 4 News 09 - 02 - 2002 00.50 STUDIO Aperto - La Giornata Italia 1 News 09 - 02 - 2002 00.50 BOCCA A Bocca - 2 Tempo Rete 4 Film 09 - 02 - 2002 01.00 AppuntAMENTO Al Cinema Rai Tre - 09 - 02 - 2002 01.00 Music NoN Stop Tmc 2 - 09 - 02 - 2002 01.00 Studio SpORT Italia 1 SporT 09 - 02 - 2002 01.00 Tg 5 - Notte Canale 5 News 09 - 02 - 2002 01.05 Fuori Orario. CosE (Mai) Viste Rai Tre - 09 - 02 - 2002 01.15 RAINOTTE Rai Due - 09 - 02 - 2002 01.15 Sottovoce Rai Uno - 09 - 02 - 2002 01.15 GiOCHI Olimpici InVERNALI - CERIMONIA Di Apertura Rai Tre - 09 - 02 - 2002 01.17 Italia Interroga Rai Due - sed-3.62/testsuite/flipcase.sed0000644000076600007660000000005010143133572013462 00000000000000s,\([^A-Za-z]*\)\([A-Za-z]*\),\1\L\u\2,gsed-3.62/testsuite/head.good0000644000076600007660000000031010143133572012751 00000000000000 "...by imposing a tiny bit of order in a communication you are translating, you are carving out a little bit of order in the universe. You will never succeed. Everything will fail and come sed-3.62/testsuite/head.inp0000644000076600007660000000072210143133572012616 00000000000000 "...by imposing a tiny bit of order in a communication you are translating, you are carving out a little bit of order in the universe. You will never succeed. Everything will fail and come to an end finally. But you have a chance to carve a little bit of order and maybe even beauty out of the raw materials that surround you everywhere, and I think there is no greater meaning in life." Donald L. Philippi, Oct 1930 - Jan 1993 sed-3.62/testsuite/head.sed0000644000076600007660000000000310143133572012573 000000000000003q sed-3.62/testsuite/inclib.good0000644000076600007660000000140310143133572013314 00000000000000 /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X11/include /usr/include/X11 /usr/local/X11/include /usr/local/include/X11 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include sed-3.62/testsuite/inclib.inp0000644000076600007660000000122710143133572013156 00000000000000 /usr/X11R6/lib /usr/X11R5/lib /usr/X11R4/lib /usr/lib/X11R6 /usr/lib/X11R5 /usr/lib/X11R4 /usr/local/X11R6/lib /usr/local/X11R5/lib /usr/local/X11R4/lib /usr/local/lib/X11R6 /usr/local/lib/X11R5 /usr/local/lib/X11R4 /usr/X11/lib /usr/lib/X11 /usr/local/X11/lib /usr/local/lib/X11 /usr/X386/lib /usr/x386/lib /usr/XFree86/lib/X11 /usr/lib /usr/local/lib /usr/unsupported/lib /usr/athena/lib /usr/local/x11r5/lib /usr/lpp/Xamples/lib /usr/openwin/lib /usr/openwin/share/lib sed-3.62/testsuite/inclib.sed0000644000076600007660000000010510143133572013135 00000000000000# inspired by an autoconf generated configure script. s;lib;include; sed-3.62/testsuite/insens.good0000644000076600007660000000001410143133572013350 000000000000001.2.3 1.2.3 sed-3.62/testsuite/insens.inp0000644000076600007660000000001710143133572013211 00000000000000Version: 1.2.3 sed-3.62/testsuite/insens.sed0000644000076600007660000000004510143133572013177 00000000000000h s/Version: *//p g s/version: *//Ip sed-3.62/testsuite/khadafy.good0000644000076600007660000000133110143133572013463 000000000000001) Muammar Qaddafi 2) Mo'ammar Gadhafi 3) Muammar Kaddafi 4) Muammar Qadhafi 5) Moammar El Kadhafi 6) Muammar Gadafi 7) Mu'ammar al-Qadafi 8) Moamer El Kazzafi 9) Moamar al-Gaddafi 10) Mu'ammar Al Qathafi 11) Muammar Al Qathafi 12) Mo'ammar el-Gadhafi 13) Moamar El Kadhafi 14) Muammar al-Qadhafi 15) Mu'ammar al-Qadhdhafi 16) Mu'ammar Qadafi 17) Moamar Gaddafi 18) Mu'ammar Qadhdhafi 19) Muammar Khaddafi 20) Muammar al-Khaddafi 21) Mu'amar al-Kadafi 22) Muammar Ghaddafy 23) Muammar Ghadafi 24) Muammar Ghaddafi 25) Muamar Kaddafi 26) Muammar Quathafi 27) Muammar Gheddafi 28) Muamar Al-Kaddafi 29) Moammar Khadafy 30) Moammar Qudhafi 31) Mu'ammar al-Qaddafi 32) Mulazim Awwal Mu'ammar Muhammad Abu Minyar al-Qadhafi sed-3.62/testsuite/khadafy.inp0000644000076600007660000000133110143133572013321 000000000000001) Muammar Qaddafi 2) Mo'ammar Gadhafi 3) Muammar Kaddafi 4) Muammar Qadhafi 5) Moammar El Kadhafi 6) Muammar Gadafi 7) Mu'ammar al-Qadafi 8) Moamer El Kazzafi 9) Moamar al-Gaddafi 10) Mu'ammar Al Qathafi 11) Muammar Al Qathafi 12) Mo'ammar el-Gadhafi 13) Moamar El Kadhafi 14) Muammar al-Qadhafi 15) Mu'ammar al-Qadhdhafi 16) Mu'ammar Qadafi 17) Moamar Gaddafi 18) Mu'ammar Qadhdhafi 19) Muammar Khaddafi 20) Muammar al-Khaddafi 21) Mu'amar al-Kadafi 22) Muammar Ghaddafy 23) Muammar Ghadafi 24) Muammar Ghaddafi 25) Muamar Kaddafi 26) Muammar Quathafi 27) Muammar Gheddafi 28) Muamar Al-Kaddafi 29) Moammar Khadafy 30) Moammar Qudhafi 31) Mu'ammar al-Qaddafi 32) Mulazim Awwal Mu'ammar Muhammad Abu Minyar al-Qadhafi sed-3.62/testsuite/khadafy.sed0000644000076600007660000000025710143133572013314 00000000000000# The Khadafy test is brought to you by Scott Anderson . . . /M[ou]'\{0,1\}am\{1,2\}[ae]r .*\([AEae]l[- ]\)\{0,1\}[GKQ]h\{0,1\}[aeu]\{1,\}\([dtz][dhz]\{0,1\}\)\{1,\}af[iy]/!d sed-3.62/testsuite/linecnt.good0000644000076600007660000000414010143133572013511 000000000000001 A dialogue on poverty 2 3 On the night when the rain beats, 4 Driven by the wind, 5 On the night when the snowflakes mingle 6 With a sleety rain, 7 I feel so helplessly cold. 8 I nibble at a lump of salt, 9 Sip the hot, oft-diluted dregs of _sake_; 10 And coughing, snuffling, 11 And stroking my scanty beard, 12 I say in my pride, 13 "There's none worthy, save I!" 14 But I shiver still with cold. 15 I pull up my hempen bedclothes, 16 Wear what few sleeveless clothes I have, 17 But cold and bitter is the night! 18 As for those poorer than myself, 19 Their parents must be cold and hungry, 20 Their wives and children beg and cry. 21 Then, how do you struggle through life? 22 23 Wide as they call the heaven and earth, 24 For me they have shrunk quite small; 25 Bright though they call the sun and moon, 26 They never shine for me. 27 Is it the same with all men, 28 Or for me alone? 29 By rare chance I was born a man 30 And no meaner than my fellows, 31 But, wearing unwadded sleeveless clothes 32 In tatters, like weeds waving in the sea, 33 Hanging from my shoulders, 34 And under the sunken roof, 35 Within the leaning walls, 36 Here I lie on straw 37 Spread on bare earth, 38 With my parents at my pillow, 39 And my wife and children at my feet, 40 All huddled in grief and tears. 41 No fire sends up smoke 42 At the cooking-place, 43 And in the cauldron 44 A spider spins its web. 45 With not a grain to cook, 46 We moan like the night thrush. 47 Then, "to cut," as the saying is, 48 "The ends of what is already too short," 49 The village headman comes, 50 With rod in hand, to our sleeping place, 51 Growling for his dues. 52 Must it be so hopeless -- 53 The way of this world? 54 55 -- Yamanoue Okura sed-3.62/testsuite/linecnt.inp0000644000076600007660000000370410143133572013354 00000000000000A dialogue on poverty On the night when the rain beats, Driven by the wind, On the night when the snowflakes mingle With a sleety rain, I feel so helplessly cold. I nibble at a lump of salt, Sip the hot, oft-diluted dregs of _sake_; And coughing, snuffling, And stroking my scanty beard, I say in my pride, "There's none worthy, save I!" But I shiver still with cold. I pull up my hempen bedclothes, Wear what few sleeveless clothes I have, But cold and bitter is the night! As for those poorer than myself, Their parents must be cold and hungry, Their wives and children beg and cry. Then, how do you struggle through life? Wide as they call the heaven and earth, For me they have shrunk quite small; Bright though they call the sun and moon, They never shine for me. Is it the same with all men, Or for me alone? By rare chance I was born a man And no meaner than my fellows, But, wearing unwadded sleeveless clothes In tatters, like weeds waving in the sea, Hanging from my shoulders, And under the sunken roof, Within the leaning walls, Here I lie on straw Spread on bare earth, With my parents at my pillow, And my wife and children at my feet, All huddled in grief and tears. No fire sends up smoke At the cooking-place, And in the cauldron A spider spins its web. With not a grain to cook, We moan like the night thrush. Then, "to cut," as the saying is, "The ends of what is already too short," The village headman comes, With rod in hand, to our sleeping place, Growling for his dues. Must it be so hopeless -- The way of this world? -- Yamanoue Okura sed-3.62/testsuite/linecnt.sed0000644000076600007660000000000210143133572013325 00000000000000= sed-3.62/testsuite/mac-mf.good0000644000076600007660000001413210143133572013217 00000000000000## config:mac-pre.in ## common Macintosh prefix for all Makefile.in in the Kerberos V5 tree # # MPW-style lines for the MakeFile # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # This first part is long enough that NFS:Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make # # End of MPW-style lines for MakeFile # WHAT = mac # Directory syntax Ä R= C= S=: U=: BUILDTOP = ::: srcdir = # FIXME Ä This doesn't translate to MPW yet, srcdir must be same as objdir # File in object dir can come from either the current dir or srcdir # # . Ä . "{srcdir}" # Default rule that puts each file into separate segment .c.o Ä .c {CC} {DepDir}{Default}.c {CFLAGS} -s {Default} -o {TargDir}{Default}.c.o CPPFLAGS = -i {SRCTOP}:include -i {BUILDTOP}:include -i {SRCTOP}:include:krb5 -i {BUILDTOP}:include:krb5 -i {CIncludes} DEFS = {CPPFLAGS} CC = c LD = link # The funny quoting in the LDFLAGS is to avoid xxx.c.o being mangled by # mac-mf.sed into xxx.c.o LDFLAGS=-t MPST -c "MPS " -sym on {Libraries}"Runtime."o {CLibraries}"StdClib."o {Libraries}"ToolLibs."o {Libraries}"Interface."o CCOPTS = LIBS = KRB5ROOT= @KRB5ROOT@ KRB4=@KRB4@ INSTALL=Duplicate -y INSTALL_PROGRAM=Duplicate -y INSTALL_DATA=Duplicate -y INSTALL_SETUID=Duplicate -y KRB5MANROOT = {KRB5ROOT}{S}man ADMIN_BINDIR = {KRB5ROOT}{S}admin SERVER_BINDIR = {KRB5ROOT}{S}sbin CLIENT_BINDIR = {KRB5ROOT}{S}bin ADMIN_MANDIR = {KRB5MANROOT}{S}man8 SERVER_MANDIR = {KRB5MANROOT}{S}man8 CLIENT_MANDIR = {KRB5MANROOT}{S}man1 FILE_MANDIR = {KRB5MANROOT}{S}man5 KRB5_LIBDIR = {KRB5ROOT}{S}lib KRB5_INCDIR = {KRB5ROOT}{S}include KRB5_INCSUBDIRS = ¶ {KRB5_INCDIR}{S}krb5 ¶ {KRB5_INCDIR}{S}asn.1 ¶ {KRB5_INCDIR}{S}kerberosIV RM = Delete -y -i CP = Duplicate -y MV = mv -f CHMOD=chmod RANLIB = @RANLIB@ ARCHIVE = @ARCHIVE@ ARADD = @ARADD@ LN = @LN_S@ AWK = @AWK@ LEX = @LEX@ LEXLIB = @LEXLIB@ YACC = @YACC@ # FIXME Ä This won't work for srcdir != objdir. But on the Mac, there # is no easy way to build a relative or absolute path, because Ä means # both the path separator, and the "go up a directory" indicator #SRCTOP = {srcdir}{S}{BUILDTOP} SRCTOP = {BUILDTOP} SUBDIRS = @subdirs@ TOPLIBD = {BUILDTOP}{S}lib OBJEXT = c.o LIBEXT = a EXEEXT = all ÄÄ # Generated automatically from Makefile.in by configure CFLAGS = {CCOPTS} {DEFS} -i ::des ##DOSBUILDTOP = ..\..\: ##DOSLIBNAME=..\crypto.lib ##DOS!include {BUILDTOP}\config\windows.in OBJS= md5.{OBJEXT} md5glue.{OBJEXT} md5crypto.{OBJEXT} SRCS= md5.c md5glue.c md5crypto.c all ÄÄ {OBJS} t_mddriver Ä t_mddriver.c.o md5.c.o Link {LDFLAGS} -o t_mddriver t_mddriver.c.o md5.c.o t_mddriver.exe Ä {CC} {CFLAGS2} -o t_mddriver.exe t_mddriver.c md5.c check ÄÄ t_mddriver{EXEEXT} {C}t_mddriver{EXEEXT} -x clean ÄÄ {RM} t_mddriver{EXEEXT} t_mddriver.{OBJEXT} # config:post.in # put all ÄÄ first just in case no other rules occur here # all ÄÄ check ÄÄ clean ÄÄ clean-{WHAT} {RM} config.log pre.c.out post.c.out Makefile.c.out clean-unix ÄÄ if test -n "{OBJS}" ; then {RM} {OBJS}; else Ä ; fi clean-windows ÄÄ {RM} Å.{OBJEXT} {RM} msvc.pdb Å.err sed-3.62/testsuite/mac-mf.inp0000644000076600007660000001425310143133572013061 00000000000000## config/mac-pre.in ## common Macintosh prefix for all Makefile.in in the Kerberos V5 tree. # # MPW-style lines for the MakeFile. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # This first part is long enough that NFS/Share doesn't notice the non-ASCII # characters in the rest of the file, so it claims that the file is type # TEXT, which is what we want. The non-ASCII chars are necessary for MPW # Make. # # End of MPW-style lines for MakeFile. # WHAT = mac # Directory syntax: R= C= S=: U=: BUILDTOP = ../../.. srcdir = . # FIXME: This doesn't translate to MPW yet, srcdir must be same as objdir. # File in object dir can come from either the current dir or srcdir. # # . : . "{srcdir}" # Default rule that puts each file into separate segment. .c.o: .c {CC} {DepDir}{Default}.c {CFLAGS} -s {Default} -o {TargDir}{Default}.c.o CPPFLAGS = -I$(SRCTOP)/include -I$(BUILDTOP)/include -I$(SRCTOP)/include/krb5 -I$(BUILDTOP)/include/krb5 -i {CIncludes} DEFS = $(CPPFLAGS) CC = c LD = link # The funny quoting in the LDFLAGS is to avoid xxx.o being mangled by # mac-mf.sed into xxx.c.o. LDFLAGS=-t MPST -c "MPS " -sym on {Libraries}"Runtime."o {CLibraries}"StdClib."o {Libraries}"ToolLibs."o {Libraries}"Interface."o CCOPTS = LIBS = KRB5ROOT= @KRB5ROOT@ KRB4=@KRB4@ INSTALL=Duplicate -y INSTALL_PROGRAM=Duplicate -y INSTALL_DATA=Duplicate -y INSTALL_SETUID=Duplicate -y KRB5MANROOT = $(KRB5ROOT)$(S)man ADMIN_BINDIR = $(KRB5ROOT)$(S)admin SERVER_BINDIR = $(KRB5ROOT)$(S)sbin CLIENT_BINDIR = $(KRB5ROOT)$(S)bin ADMIN_MANDIR = $(KRB5MANROOT)$(S)man8 SERVER_MANDIR = $(KRB5MANROOT)$(S)man8 CLIENT_MANDIR = $(KRB5MANROOT)$(S)man1 FILE_MANDIR = $(KRB5MANROOT)$(S)man5 KRB5_LIBDIR = $(KRB5ROOT)$(S)lib KRB5_INCDIR = $(KRB5ROOT)$(S)include KRB5_INCSUBDIRS = \ $(KRB5_INCDIR)$(S)krb5 \ $(KRB5_INCDIR)$(S)asn.1 \ $(KRB5_INCDIR)$(S)kerberosIV RM = Delete -y -i CP = Duplicate -y MV = mv -f CHMOD=chmod RANLIB = @RANLIB@ ARCHIVE = @ARCHIVE@ ARADD = @ARADD@ LN = @LN_S@ AWK = @AWK@ LEX = @LEX@ LEXLIB = @LEXLIB@ YACC = @YACC@ # FIXME: This won't work for srcdir != objdir. But on the Mac, there # is no easy way to build a relative or absolute path, because : means # both the path separator, and the "go up a directory" indicator. #SRCTOP = $(srcdir)$(S)$(BUILDTOP) SRCTOP = $(BUILDTOP) SUBDIRS = @subdirs@ TOPLIBD = $(BUILDTOP)$(S)lib OBJEXT = c.o LIBEXT = a EXEEXT = all:: # Generated automatically from Makefile.in by configure. CFLAGS = $(CCOPTS) $(DEFS) -I$(srcdir)/../des ##DOSBUILDTOP = ..\..\.. ##DOSLIBNAME=..\crypto.lib ##DOS!include $(BUILDTOP)\config\windows.in OBJS= md5.$(OBJEXT) md5glue.$(OBJEXT) md5crypto.$(OBJEXT) SRCS= $(srcdir)/md5.c $(srcdir)/md5glue.c $(srcdir)/md5crypto.c all:: $(OBJS) t_mddriver: t_mddriver.o md5.o $(CC) $(CFLAGS) $(LDFLAGS) -o t_mddriver t_mddriver.o md5.o t_mddriver.exe: $(CC) $(CFLAGS2) -o t_mddriver.exe t_mddriver.c md5.c check:: t_mddriver$(EXEEXT) $(C)t_mddriver$(EXEEXT) -x clean:: $(RM) t_mddriver$(EXEEXT) t_mddriver.$(OBJEXT) # config/post.in # put all:: first just in case no other rules occur here # all:: check:: clean:: clean-$(WHAT) $(RM) config.log pre.out post.out Makefile.out clean-unix:: if test -n "$(OBJS)" ; then $(RM) $(OBJS); else :; fi clean-windows:: $(RM) *.$(OBJEXT) $(RM) msvc.pdb *.err sed-3.62/testsuite/mac-mf.sed0000644000076600007660000001074010143133572013043 00000000000000# Rewrite default rules from .c.o: to .c.o: .c /^\./s/^\(\.[a-z]*\)\(\.[a-z]*\)\( *: *\)$/\1\2\3 \1/ # Change dependency char. /::/s/::/ \\Option-f\\Option-f /g /:/s/:/ \\Option-f /g /^[SU]=/s/ \\Option-f /:/g # Change syntax of Makefile vars. /\$/s/\${\([a-zA-Z0-9_]*\)}/{\1}/g /\$/s/\$(\([a-zA-Z0-9_]*\))/{\1}/g # Change $@ to {targ} /\$@/s/\$@/{targ}/g # Change pathname syntax. # # If line ends with .. then assume it sets a variable that will # be used to prefix something else -- eliminate one colon, assuming # that a slash after the ${name} will turn into the missing colon. # Mac pathname conventions are IRREGULAR and UGLY! /\./s,\.\./\.\.$,::, /\./s,\.\.$,:, # Same if it ends with . (a single dot); turn it into nothing. /\./s,\.$,,g # Rules for .. and . elsewhere in the line # Convert ../: to ::, recur to get whole paths. /\./s,\.\./:,::,g # Convert ../../ to ::: /\./s,\.\./\.\./,:::,g /\./s,\.\./,::,g /\.\//s,\./,:,g /\//s,/,:,g /=/s/ = \.$/ = :/ # Comment out any explicit srcdir setting. # /srcdir/s/^srcdir/# srcdir/ /version/s/^version=/# version=/ /BASEDIR/s/^BASEDIR =.*$/BASEDIR = "{srcroot}"/ /{BASEDIR}:/s/{BASEDIR}:/{BASEDIR}/g # The original lines screw up -I$(srcdir)/../des by eliminating a colon. # Proposed fix: Eliminate srcdir prefixes totally. #/{srcdir}:/s/{srcdir}:/"{srcdir}"/g /{srcdir}:/s/{srcdir}://g #/"{srcdir}":/s/"{srcdir}":/"{srcdir}"/g # Comment out settings of anything set by mpw host config. ##/CC/s/^CC *=/#CC =/ ##/CFLAGS/s/^CFLAGS *=/#CFLAGS =/ ##/LDFLAGS/s/^LDFLAGS *=/#LDFLAGS =/ # Change -I usage. /-I/s/-I\./-i :/g /-I/s/-I::bfd/-i ::bfd:/g /-I/s/-I::include/-i ::include:/g /-I/s/-I/-i /g # Change -D usage. /-D/s/\([ =]\)-D\([^ ]*\)/\1-d \2/g # Change continuation char. /\\$/s/\\$/\\Option-d/ # Change wildcard char. /^[^#]/s/\*/\\Option-x/g # Change path of various types of source files. #/\.[chly]/s/\([ ><=]\)\([-a-zA-Z0-9_$:"]*\)\.\([chly]\)/\1"{s}"\2.\3/g #/\.[chly]/s/^\([-a-zA-Z0-9_${}:"]*\)\.\([chly]\)/"{s}"\1.\2/g # Skip the {s} and {o} business for now... # Fix some overenthusiasms. #/{s}/s/"{s}""{srcdir}"/"{srcdir}"/g #/{s}/s/"{s}"{\([a-zA-Z0-9_]*\)dir}/"{\1dir}"/g #/{s}/s/"{s}"{\([a-zA-Z0-9_]*\)DIR}/"{\1DIR}"/g #/{s}/s/"{s}""{\([a-zA-Z0-9_]*\)dir}"/"{\1dir}"/g #/{s}/s/"{s}""{\([a-zA-Z0-9_]*\)DIR}"/"{\1DIR}"/g #/{s}/s/"{s}":/:/g #/{s}/s/^"{s}"//g #/^\./s/"{s}"\././g # Change extension and path of objects, except in the OBJEXT line. #/^OBJEXT/!s/\([ =]\)\([-a-zA-Z0-9_${}:"]*\)\.o/\1"{o}"\2.c.o/g #/\.o/s/^\([-a-zA-Z0-9_${}:"]*\)\.o/"{o}"\1.c.o/g # Skip the {o} stuff for now... /^OBJEXT/!s/\([ =]\)\([-a-zA-Z0-9_${}:"]*\)\.o/\1\2.c.o/g /\.o/s/^\([-a-zA-Z0-9_${}:"]*\)\.o/\1.c.o/g # Clean up. #/\.o/s/"{o}""{o}"/"{o}"/g #/{o}/s/^"{o}"\([a-zA-Z0-9_]*\)=/\1=/g # Change extension of libs. # /\.a/s/lib\([a-z]*\)\.a/lib\1.o/g # Remove non-echo option. /^ -/s/^ -/ / # Change cp to duplicate. # /cp/s/^\([ ]*\)cp /\1Duplicate -d -y / # Change mv to rename. # /mv/s/^\([ ]*\)mv /\1Rename -y / # /Rename/s/^\([ ]*\)Rename -y -f/\1Rename -y/ # Change rm to delete. /^RM=/s/rm -f/Delete -i -y/ # /rm/s/^\([ ]*\)rm /\1Delete -y / # /Delete/s/^\([ ]*\)Delete -y -f/\1Delete -y/ # Comment out symlinking. # /ln/s/^\([ ]*\)ln /\1# ln / # Remove -c from explicit compiler calls. # /-c/s/{CC}\(.*\) -c \(.*\)\([-a-z]*\)\.c/{CC}\1 \2\3.c -o "{o}"\3.c.o/g # Don't ask... prev subst seems to omit the second filename. # /-o/s/\([-a-z]*\)\.c -o "{o}".c.o/\1\.c -o "{o}"\1.c.o/ # Change linking cc to link. /LDFLAGS/ s/{CC} \(.*\){CFLAGS}\(.*\){LDFLAGS}/Link \1 \2 {LDFLAGS}/ /CFLAGS_LINK/s/{CC} \(.*\){CFLAGS_LINK}\(.*\){LDFLAGS}/Link \1 \2 {LDFLAGS}/ # Comment out .PHONY rules. /\.PHONY/s/^\.PHONY/# \.PHONY/ # Comment out .SUFFIXES rules. /\.SUFFIXES/s/^\.SUFFIXES/# \.SUFFIXES/ # Comment out .PRECIOUS rules. /\.PRECIOUS/s/^\.PRECIOUS/# \.PRECIOUS/ ## Comment out default rules. ##/^\./s/^\(\.[a-z]*\.[a-z]* \)/# \1/ # # End of original hack-mf.sed # # Begin original hack-mf2.sed # # Transform expressions. # Set the install program appropriate. # /INSTALL/s/^INSTALL *= *`.*`:install.sh -c/INSTALL = Duplicate -y/ # Include from the extra-include dir. # /^INCLUDES = /s/^INCLUDES = /INCLUDES = -i "{srcroot}"extra-include / # Yuck - remove unconverted autoconf things. # /@/s/@[^ ]*@//g # Hackery, pure and simple # To speed up compiles, remove duplicated -i options. /-i/s/\(-i [^ ]*\) \1 /\1 /g # Note! There are 8-bit characters in the three lines below: # 0xc4, 0xb6, 0xc5. /Option/s/\\Option-f/Ä/g /Option/s/\\Option-d/¶/g /Option/s/\\Option-x/Å/g sed-3.62/testsuite/madding.good0000644000076600007660000001251510143133572013465 00000000000000The girl on the summit of the load sat motionless, surrounded by tables and chairs with their legs upwards, backed by an oak settle, and ornamented in front by pots of geraniums, myrtles, and cactuses, together with a caged canary -- all probably from the windows of the house just vacated. There was also a cat in a willow basket, from the partly-opened lid of which she gazed with half-closed eyes, and affectionately-surveyed the small birds around. The handsome girl waited for some time idly in her place, and the only sound heard in the stillness was the hopping of the canary up and down the perches of its prison. Then she looked attentively downwards. It was not at the bird, nor at the cat; it was at an oblong package tied in paper, and lying between them. She turned her head to learn if the waggoner were coming. He was not yet in sight; and her eyes crept back to the package, her thoughts seeming to run upon what was inside it. At length she drew the article into her lap, and untied the paper covering; a small swing looking- glass was disclosed, in which she proceeded to survey herself attentively. She parted her lips and smiled. It was a fine morning, and the sun lighted up to a scarlet glow the crimson jacket she wore, and painted a soft lustre upon her bright face and dark hair. The myrtles, geraniums, and cactuses packed around her were fresh and green, and at such a leafless season they invested the whole concern of horses, waggon, furniture, and girl with a peculiar vernal charm. What possessed her to indulge in such a performance in the sight of the sparrows, blackbirds, and unperceived farmer who were alone its spectators, -- whether the smile began as a factitious one, to test her capacity in that art, -- nobody knows; it ended certainly in a real smile. She blushed at herself, and seeing her reflection blush, blushed the more. The change from the customary spot and necessary occasion of such an act -- from the dressing hour in a bedroom to a time of travelling out of doors -- lent to the idle deed a novelty it did not intrinsically possess. The picture was a delicate one. Woman's prescriptive infirmity had stalked into the sunlight, which had clothed it in the freshness of an originality. A cynical inference was irresistible by Gabriel Oak as he regarded the scene, generous though he fain would have been. There was no necessity whatever for her looking in the glass. She did not adjust her hat, or pat her hair, or press a dimple into shape, or do one thing to signify that any such intention had been her motive in taking up the glass. She simply observed herself as a fair product of Nature in the feminine kind, her thoughts seeming to glide into far-off though likely dramas in which men would play a part -- vistas of probable triumphs -- the smiles being of a phase suggesting that hearts were imagined as lost and won. Still, this was but conjecture, and the whole series of actions was so idly put forth as to make it rash to assert that intention had any part in them at all. The waggoner's steps were heard returning. She put the glass in the paper, and the whole again into its place. When the waggon had passed on, Gabriel withdrew from his point of espial, and descending into the road, followed the vehicle to the turnpike-gate some way beyond the bottom of the hill, where the object of his contemplation now halted for the payment of toll. About twenty steps still remained between him and the gate, when he heard a dispute. It was a difference concerning twopence between the persons with the waggon and the man at the toll-bar. "Mis'ess's niece is upon the top of the things, and she says that's enough that I've offered ye, you great miser, and she won't pay any more." These were the waggoner's words. "Very well; then mis'ess's niece can't pass," said the turnpike-keeper, closing the gate. Oak looked from one to the other of the disputants, and fell into a reverie. There was something in the tone of twopence remarkably insignificant. Threepence had a definite value as money -- it was an appreciable infringement on a day's wages, and, as such, a higgling matter; but twopence -- "Here," he said, stepping forward and handing twopence to the gatekeeper; "let the young woman pass." He looked up at her then; she heard his words, and looked down. Gabriel's features adhered throughout their form so exactly to the middle line between the beauty of St. John and the ugliness of Judas Iscariot, as represented in a window of the church he attended, that not a single lineament could be selected and called worthy either of distinction or notoriety. The red-jacketed and dark-haired maiden seemed to think so too, for she carelessly glanced over him, and told her man to drive on. She might have looked her thanks to Gabriel on a minute scale, but she did not speak them; more probably she felt none, for in gaining her a passage he had lost her her point, and we know how women take a favour of that kind. The gatekeeper surveyed the retreating vehicle. "That's a handsome maid," he said to Oak. "But she has her faults," said Gabriel. "True, farmer." "And the greatest of them is -- well, what it is always." "Beating people down? ay, 'tis so." "O no." "What, then?" Gabriel, perhaps a little piqued by the comely traveller's indifference, glanced back to where he had witnessed her performance over the hedge, and said, "Vanity, dude." sed-3.62/testsuite/madding.inp0000644000076600007660000001250710143133572013324 00000000000000The girl on the summit of the load sat motionless, surrounded by tables and chairs with their legs upwards, backed by an oak settle, and ornamented in front by pots of geraniums, myrtles, and cactuses, together with a caged canary -- all probably from the windows of the house just vacated. There was also a cat in a willow basket, from the partly-opened lid of which she gazed with half-closed eyes, and affectionately-surveyed the small birds around. The handsome girl waited for some time idly in her place, and the only sound heard in the stillness was the hopping of the canary up and down the perches of its prison. Then she looked attentively downwards. It was not at the bird, nor at the cat; it was at an oblong package tied in paper, and lying between them. She turned her head to learn if the waggoner were coming. He was not yet in sight; and her eyes crept back to the package, her thoughts seeming to run upon what was inside it. At length she drew the article into her lap, and untied the paper covering; a small swing looking- glass was disclosed, in which she proceeded to survey herself attentively. She parted her lips and smiled. It was a fine morning, and the sun lighted up to a scarlet glow the crimson jacket she wore, and painted a soft lustre upon her bright face and dark hair. The myrtles, geraniums, and cactuses packed around her were fresh and green, and at such a leafless season they invested the whole concern of horses, waggon, furniture, and girl with a peculiar vernal charm. What possessed her to indulge in such a performance in the sight of the sparrows, blackbirds, and unperceived farmer who were alone its spectators, -- whether the smile began as a factitious one, to test her capacity in that art, -- nobody knows; it ended certainly in a real smile. She blushed at herself, and seeing her reflection blush, blushed the more. The change from the customary spot and necessary occasion of such an act -- from the dressing hour in a bedroom to a time of travelling out of doors -- lent to the idle deed a novelty it did not intrinsically possess. The picture was a delicate one. Woman's prescriptive infirmity had stalked into the sunlight, which had clothed it in the freshness of an originality. A cynical inference was irresistible by Gabriel Oak as he regarded the scene, generous though he fain would have been. There was no necessity whatever for her looking in the glass. She did not adjust her hat, or pat her hair, or press a dimple into shape, or do one thing to signify that any such intention had been her motive in taking up the glass. She simply observed herself as a fair product of Nature in the feminine kind, her thoughts seeming to glide into far-off though likely dramas in which men would play a part -- vistas of probable triumphs -- the smiles being of a phase suggesting that hearts were imagined as lost and won. Still, this was but conjecture, and the whole series of actions was so idly put forth as to make it rash to assert that intention had any part in them at all. The waggoner's steps were heard returning. She put the glass in the paper, and the whole again into its place. When the waggon had passed on, Gabriel withdrew from his point of espial, and descending into the road, followed the vehicle to the turnpike-gate some way beyond the bottom of the hill, where the object of his contemplation now halted for the payment of toll. About twenty steps still remained between him and the gate, when he heard a dispute. It was a difference concerning twopence between the persons with the waggon and the man at the toll-bar. "Mis'ess's niece is upon the top of the things, and she says that's enough that I've offered ye, you great miser, and she won't pay any more." These were the waggoner's words. "Very well; then mis'ess's niece can't pass," said the turnpike-keeper, closing the gate. Oak looked from one to the other of the disputants, and fell into a reverie. There was something in the tone of twopence remarkably insignificant. Threepence had a definite value as money -- it was an appreciable infringement on a day's wages, and, as such, a higgling matter; but twopence -- "Here," he said, stepping forward and handing twopence to the gatekeeper; "let the young woman pass." He looked up at her then; she heard his words, and looked down. Gabriel's features adhered throughout their form so exactly to the middle line between the beauty of St. John and the ugliness of Judas Iscariot, as represented in a window of the church he attended, that not a single lineament could be selected and called worthy either of distinction or notoriety. The red-jacketed and dark-haired maiden seemed to think so too, for she carelessly glanced over him, and told her man to drive on. She might have looked her thanks to Gabriel on a minute scale, but she did not speak them; more probably she felt none, for in gaining her a passage he had lost her her point, and we know how women take a favour of that kind. The gatekeeper surveyed the retreating vehicle. "That's a handsome maid," he said to Oak. "But she has her faults," said Gabriel. "True, farmer." "And the greatest of them is -- well, what it is always." "Beating people down? ay, 'tis so." "O no." "What, then?" Gabriel, perhaps a little piqued by the comely traveller's indifference, glanced back to where he had witnessed her performance over the hedge, and said, "Vanity." sed-3.62/testsuite/madding.sed0000644000076600007660000002560010143133572013307 00000000000000# this is from Thomas Hardy's _Far From the Madding Crowd_. # # cf ftp://ftp.cdrom.com/pub/gutenberg/etext94/crowd10a.txt # # the point of this test, in case it isn't obvious, is to overfill fixed # buffers wherever they might be. # s/The girl on the summit of the load sat motionless, surrounded by tables and chairs with their legs upwards, backed by an oak settle, and ornamented in front by pots of geraniums, myrtles, and cactuses, together with a caged canary -- all probably from the windows of the house just vacated. There was also a cat in a willow basket, from the partly-opened lid of which she gazed with half-closed eyes, and affectionately-surveyed the small birds around. The handsome girl waited for some time idly in her place, and the only sound heard in the stillness was the hopping of the canary up and down the perches of its prison. Then she looked attentively downwards. It was not at the bird, nor at the cat; it was at an oblong package tied in paper, and lying between them. She turned her head to learn if the waggoner were coming. He was not yet in sight; and her eyes crept back to the package, her thoughts seeming to run upon what was inside it. At length she drew the article into her lap, and untied the paper covering; a small swing looking- glass was disclosed, in which she proceeded to survey herself attentively. She parted her lips and smiled. It was a fine morning, and the sun lighted up to a scarlet glow the crimson jacket she wore, and painted a soft lustre upon her bright face and dark hair. The myrtles, geraniums, and cactuses packed around her were fresh and green, and at such a leafless season they invested the whole concern of horses, waggon, furniture, and girl with a peculiar vernal charm. What possessed her to indulge in such a performance in the sight of the sparrows, blackbirds, and unperceived farmer who were alone its spectators, -- whether the smile began as a factitious one, to test her capacity in that art, -- nobody knows; it ended certainly in a real smile. She blushed at herself, and seeing her reflection blush, blushed the more. The change from the customary spot and necessary occasion of such an act -- from the dressing hour in a bedroom to a time of travelling out of doors -- lent to the idle deed a novelty it did not intrinsically possess. The picture was a delicate one. Woman's prescriptive infirmity had stalked into the sunlight, which had clothed it in the freshness of an originality. A cynical inference was irresistible by Gabriel Oak as he regarded the scene, generous though he fain would have been. There was no necessity whatever for her looking in the glass. She did not adjust her hat, or pat her hair, or press a dimple into shape, or do one thing to signify that any such intention had been her motive in taking up the glass. She simply observed herself as a fair product of Nature in the feminine kind, her thoughts seeming to glide into far-off though likely dramas in which men would play a part -- vistas of probable triumphs -- the smiles being of a phase suggesting that hearts were imagined as lost and won. Still, this was but conjecture, and the whole series of actions was so idly put forth as to make it rash to assert that intention had any part in them at all. The waggoner's steps were heard returning. She put the glass in the paper, and the whole again into its place. When the waggon had passed on, Gabriel withdrew from his point of espial, and descending into the road, followed the vehicle to the turnpike-gate some way beyond the bottom of the hill, where the object of his contemplation now halted for the payment of toll. About twenty steps still remained between him and the gate, when he heard a dispute. It was a difference concerning twopence between the persons with the waggon and the man at the toll-bar. "Mis'ess's niece is upon the top of the things, and she says that's enough that I've offered ye, you great miser, and she won't pay any more." These were the waggoner's words. "Very well; then mis'ess's niece can't pass," said the turnpike-keeper, closing the gate. Oak looked from one to the other of the disputants, and fell into a reverie. There was something in the tone of twopence remarkably insignificant. Threepence had a definite value as money -- it was an appreciable infringement on a day's wages, and, as such, a higgling matter; but twopence -- "Here," he said, stepping forward and handing twopence to the gatekeeper; "let the young woman pass." He looked up at her then; she heard his words, and looked down. Gabriel's features adhered throughout their form so exactly to the middle line between the beauty of St. John and the ugliness of Judas Iscariot, as represented in a window of the church he attended, that not a single lineament could be selected and called worthy either of distinction or notoriety. The red-jacketed and dark-haired maiden seemed to think so too, for she carelessly glanced over him, and told her man to drive on. She might have looked her thanks to Gabriel on a minute scale, but she did not speak them; more probably she felt none, for in gaining her a passage he had lost her her point, and we know how women take a favour of that kind. The gatekeeper surveyed the retreating vehicle. "That's a handsome maid," he said to Oak. "But she has her faults," said Gabriel. "True, farmer." "And the greatest of them is -- well, what it is always." "Beating people down? ay, 'tis so." "O no." "What, then?" Gabriel, perhaps a little piqued by the comely traveller's indifference, glanced back to where he had witnessed her performance over the hedge, and said, "Vanity."/The girl on the summit of the load sat motionless, surrounded by tables and chairs with their legs upwards, backed by an oak settle, and ornamented in front by pots of geraniums, myrtles, and cactuses, together with a caged canary -- all probably from the windows of the house just vacated. There was also a cat in a willow basket, from the partly-opened lid of which she gazed with half-closed eyes, and affectionately-surveyed the small birds around. The handsome girl waited for some time idly in her place, and the only sound heard in the stillness was the hopping of the canary up and down the perches of its prison. Then she looked attentively downwards. It was not at the bird, nor at the cat; it was at an oblong package tied in paper, and lying between them. She turned her head to learn if the waggoner were coming. He was not yet in sight; and her eyes crept back to the package, her thoughts seeming to run upon what was inside it. At length she drew the article into her lap, and untied the paper covering; a small swing looking- glass was disclosed, in which she proceeded to survey herself attentively. She parted her lips and smiled. It was a fine morning, and the sun lighted up to a scarlet glow the crimson jacket she wore, and painted a soft lustre upon her bright face and dark hair. The myrtles, geraniums, and cactuses packed around her were fresh and green, and at such a leafless season they invested the whole concern of horses, waggon, furniture, and girl with a peculiar vernal charm. What possessed her to indulge in such a performance in the sight of the sparrows, blackbirds, and unperceived farmer who were alone its spectators, -- whether the smile began as a factitious one, to test her capacity in that art, -- nobody knows; it ended certainly in a real smile. She blushed at herself, and seeing her reflection blush, blushed the more. The change from the customary spot and necessary occasion of such an act -- from the dressing hour in a bedroom to a time of travelling out of doors -- lent to the idle deed a novelty it did not intrinsically possess. The picture was a delicate one. Woman's prescriptive infirmity had stalked into the sunlight, which had clothed it in the freshness of an originality. A cynical inference was irresistible by Gabriel Oak as he regarded the scene, generous though he fain would have been. There was no necessity whatever for her looking in the glass. She did not adjust her hat, or pat her hair, or press a dimple into shape, or do one thing to signify that any such intention had been her motive in taking up the glass. She simply observed herself as a fair product of Nature in the feminine kind, her thoughts seeming to glide into far-off though likely dramas in which men would play a part -- vistas of probable triumphs -- the smiles being of a phase suggesting that hearts were imagined as lost and won. Still, this was but conjecture, and the whole series of actions was so idly put forth as to make it rash to assert that intention had any part in them at all. The waggoner's steps were heard returning. She put the glass in the paper, and the whole again into its place. When the waggon had passed on, Gabriel withdrew from his point of espial, and descending into the road, followed the vehicle to the turnpike-gate some way beyond the bottom of the hill, where the object of his contemplation now halted for the payment of toll. About twenty steps still remained between him and the gate, when he heard a dispute. It was a difference concerning twopence between the persons with the waggon and the man at the toll-bar. "Mis'ess's niece is upon the top of the things, and she says that's enough that I've offered ye, you great miser, and she won't pay any more." These were the waggoner's words. "Very well; then mis'ess's niece can't pass," said the turnpike-keeper, closing the gate. Oak looked from one to the other of the disputants, and fell into a reverie. There was something in the tone of twopence remarkably insignificant. Threepence had a definite value as money -- it was an appreciable infringement on a day's wages, and, as such, a higgling matter; but twopence -- "Here," he said, stepping forward and handing twopence to the gatekeeper; "let the young woman pass." He looked up at her then; she heard his words, and looked down. Gabriel's features adhered throughout their form so exactly to the middle line between the beauty of St. John and the ugliness of Judas Iscariot, as represented in a window of the church he attended, that not a single lineament could be selected and called worthy either of distinction or notoriety. The red-jacketed and dark-haired maiden seemed to think so too, for she carelessly glanced over him, and told her man to drive on. She might have looked her thanks to Gabriel on a minute scale, but she did not speak them; more probably she felt none, for in gaining her a passage he had lost her her point, and we know how women take a favour of that kind. The gatekeeper surveyed the retreating vehicle. "That's a handsome maid," he said to Oak. "But she has her faults," said Gabriel. "True, farmer." "And the greatest of them is -- well, what it is always." "Beating people down? ay, 'tis so." "O no." "What, then?" Gabriel, perhaps a little piqued by the comely traveller's indifference, glanced back to where he had witnessed her performance over the hedge, and said, "Vanity, dude."/ sed-3.62/testsuite/manis.good0000644000076600007660000000073110143133572013166 00000000000000s%@CFLAGS@%%g s%@CPPFLAGS@%-I/%g s%@CXXFLAGS@%-x c++%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%-L/usr/lib%g s%@LIBS@%-lgnu -lbfd%g s%@exec_prefix@%%g s%@prefix@%$prefix%g s%@RANLIB@%$RANLIB%g s%@CC@%/usr/local/bin/gcc%g s%@CPP@%$CPP%g s%@XCFLAGS@%$XCFLAGS%g s%@XINCLUDES@%$XINCLUDES%g s%@XLIBS@%$XLIBS%g s%@XPROGS@%$XPROGS%g s%@TCLHDIR@%$TCLHDIR%g s%@TCLLIB@%$TCLLIB%g s%@TKHDIR@%$TKHDIR%g s%@TKLIB@%$TKLIB%g s%@PTY_TYPE@%$PTY_TYPE%g s%@EVENT_TYPE@%$EVENT_TYPE%g s%@SETUID@%$SETUID%g sed-3.62/testsuite/manis.inp0000644000076600007660000000073110143133572013024 00000000000000s%@CFLAGS@%%g s%@CPPFLAGS@%-I/%g s%@CXXFLAGS@%-x c++%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%-L/usr/lib%g s%@LIBS@%-lgnu -lbfd%g s%@exec_prefix@%%g s%@prefix@%$prefix%g s%@RANLIB@%$RANLIB%g s%@CC@%/usr/local/bin/gcc%g s%@CPP@%$CPP%g s%@XCFLAGS@%$XCFLAGS%g s%@XINCLUDES@%$XINCLUDES%g s%@XLIBS@%$XLIBS%g s%@XPROGS@%$XPROGS%g s%@TCLHDIR@%$TCLHDIR%g s%@TCLLIB@%$TCLLIB%g s%@TKHDIR@%$TKHDIR%g s%@TKLIB@%$TKLIB%g s%@PTY_TYPE@%$PTY_TYPE%g s%@EVENT_TYPE@%$EVENT_TYPE%g s%@SETUID@%$SETUID%g sed-3.62/testsuite/manis.sed0000644000076600007660000000043010143133572013005 00000000000000# straight out of an autoconf-generated configure. # The input should look just like the input after this is run. # # Protect against being on the right side of a sed subst in config.status. s/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; s/@@/%@/; s/@@/@%/; s/@g$/%g/ sed-3.62/testsuite/middle.good0000644000076600007660000000031010143133572013306 00000000000000 universe. You will never succeed. Everything will fail and come to an end finally. But you have a chance to carve a little bit of order and maybe even beauty out of the raw materials that sed-3.62/testsuite/middle.inp0000644000076600007660000000072210143133572013153 00000000000000 "...by imposing a tiny bit of order in a communication you are translating, you are carving out a little bit of order in the universe. You will never succeed. Everything will fail and come to an end finally. But you have a chance to carve a little bit of order and maybe even beauty out of the raw materials that surround you everywhere, and I think there is no greater meaning in life." Donald L. Philippi, Oct 1930 - Jan 1993 sed-3.62/testsuite/middle.sed0000644000076600007660000000000510143133572013132 000000000000003,5p sed-3.62/testsuite/newjis.good0000644000076600007660000000013210143133572013351 00000000000000$B$H$J$j$NM9JX6I$K(B $B$?$F$+$1$?$N$O(B $B$?$F$+$1$?$+$C$?$+$i(B $B$?$F$+$1$?!#(B sed-3.62/testsuite/newjis.inp0000644000076600007660000000013410143133572013211 00000000000000$B$H$J$j$N$?$1$,$-$K(B $B$?$F$+$1$?$N$O(B $B$?$F$+$1$?$+$C$?$+$i(B $B$?$F$+$1$?!#(B sed-3.62/testsuite/newjis.sed0000644000076600007660000000002310143133572013173 00000000000000s/$?$1$,$-/M9JX6I/ sed-3.62/testsuite/noeol.good0000644000076600007660000000011510143133572013167 00000000000000This file is uniquewakuwaku in that it doeswakuwaku end in a newline.wakuwakused-3.62/testsuite/noeol.inp0000644000076600007660000000006510143133572013031 00000000000000This file is unique in that it does end in a newline.sed-3.62/testsuite/noeol.sed0000644000076600007660000000001710143133572013013 00000000000000s/$/wakuwaku/g sed-3.62/testsuite/noeolw.1good0000644000076600007660000000017410143133572013444 00000000000000This file is unique in that it does end in a newline. This file is unique in that it does end in a newline. in that it does sed-3.62/testsuite/noeolw.2good0000644000076600007660000000006510143133572013444 00000000000000This file is unique in that it does end in a newline.sed-3.62/testsuite/noeolw.good0000644000076600007660000000032710143133572013363 00000000000000This file is unique This file is unique in that it does in that it does end in a newline. end in a newline. This file is unique This file is unique in that it does in that it does end in a newline. end in a newline.sed-3.62/testsuite/noeolw.sed0000644000076600007660000000010010143133572013173 00000000000000w noeolw.1out $ { x w noeolw.1out x } h 1,3w noeolw.2out p p sed-3.62/testsuite/numsub.good0000644000076600007660000000010710143133572013365 00000000000000foo foo fo oo f oo foo foo foo foo foo foo foo bar foo foo foo foo foo sed-3.62/testsuite/numsub.inp0000644000076600007660000000021610143133572013224 00000000000000foo foo fo oo f oo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo fo oo f oo foo foo foo foo foo foo foo foo foo foo foo foo foo sed-3.62/testsuite/numsub.sed0000644000076600007660000000021210143133572013205 00000000000000# the first one matches, the second doesn't 1s/foo/bar/10 2s/foo/bar/20 # The second line should be deleted. ssed 3.55-3.58 do not. t d sed-3.62/testsuite/numsub2.good0000644000076600007660000000000010143133572013437 00000000000000sed-3.62/testsuite/numsub2.inp0000644000076600007660000000000110143133572013276 00000000000000 sed-3.62/testsuite/numsub2.sed0000644000076600007660000000001110143133572013264 00000000000000s/a*/b/2 sed-3.62/testsuite/numsub3.good0000644000076600007660000000000010143133572013440 00000000000000sed-3.62/testsuite/numsub3.inp0000644000076600007660000000000110143133572013277 00000000000000 sed-3.62/testsuite/numsub3.sed0000644000076600007660000000001210143133572013266 00000000000000s/^a*/b/2 sed-3.62/testsuite/numsub4.good0000644000076600007660000000000010143133572013441 00000000000000sed-3.62/testsuite/numsub4.inp0000644000076600007660000000000210143133572013301 00000000000000z sed-3.62/testsuite/numsub4.sed0000644000076600007660000000001310143133572013270 00000000000000s/^a*/b/2p sed-3.62/testsuite/numsub5.good0000644000076600007660000000000010143133572013442 00000000000000sed-3.62/testsuite/numsub5.inp0000644000076600007660000000000210143133572013302 00000000000000z sed-3.62/testsuite/numsub5.sed0000644000076600007660000000001210143133572013270 00000000000000s/a*/b/3p sed-3.62/testsuite/pcre1.good0000644000076600007660000020175510143133572013102 00000000000000/the quick brown fox/ the quick brown fox 0: the quick brown fox What do you know about the quick brown fox? 0: the quick brown fox *** Failers No match The quick brown FOX No match What do you know about THE QUICK BROWN FOX? No match /The quick brown fox/i the quick brown fox 0: the quick brown fox The quick brown FOX 0: The quick brown FOX What do you know about the quick brown fox? 0: the quick brown fox What do you know about THE QUICK BROWN FOX? 0: THE QUICK BROWN FOX /abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ abcd\t\n\r\f\a\e9;\$\\?caxyz 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ abxyzpqrrrabbxyyyypqAzz 0: abxyzpqrrrabbxyyyypqAzz abxyzpqrrrabbxyyyypqAzz 0: abxyzpqrrrabbxyyyypqAzz aabxyzpqrrrabbxyyyypqAzz 0: aabxyzpqrrrabbxyyyypqAzz aaabxyzpqrrrabbxyyyypqAzz 0: aaabxyzpqrrrabbxyyyypqAzz aaaabxyzpqrrrabbxyyyypqAzz 0: aaaabxyzpqrrrabbxyyyypqAzz abcxyzpqrrrabbxyyyypqAzz 0: abcxyzpqrrrabbxyyyypqAzz aabcxyzpqrrrabbxyyyypqAzz 0: aabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypAzz 0: aaabcxyzpqrrrabbxyyyypAzz aaabcxyzpqrrrabbxyyyypqAzz 0: aaabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypqqAzz 0: aaabcxyzpqrrrabbxyyyypqqAzz aaabcxyzpqrrrabbxyyyypqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqAzz aaabcxyzpqrrrabbxyyyypqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz aaaabcxyzpqrrrabbxyyyypqAzz 0: aaaabcxyzpqrrrabbxyyyypqAzz abxyzzpqrrrabbxyyyypqAzz 0: abxyzzpqrrrabbxyyyypqAzz aabxyzzzpqrrrabbxyyyypqAzz 0: aabxyzzzpqrrrabbxyyyypqAzz aaabxyzzzzpqrrrabbxyyyypqAzz 0: aaabxyzzzzpqrrrabbxyyyypqAzz aaaabxyzzzzpqrrrabbxyyyypqAzz 0: aaaabxyzzzzpqrrrabbxyyyypqAzz abcxyzzpqrrrabbxyyyypqAzz 0: abcxyzzpqrrrabbxyyyypqAzz aabcxyzzzpqrrrabbxyyyypqAzz 0: aabcxyzzzpqrrrabbxyyyypqAzz aaabcxyzzzzpqrrrabbxyyyypqAzz 0: aaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbxyyyypqAzz 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyypqAzz 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyypqAzz 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz aaabcxyzpqrrrabbxyyyypABzz 0: aaabcxyzpqrrrabbxyyyypABzz aaabcxyzpqrrrabbxyyyypABBzz 0: aaabcxyzpqrrrabbxyyyypABBzz >>>aaabxyzpqrrrabbxyyyypqAzz 0: aaabxyzpqrrrabbxyyyypqAzz >aaaabxyzpqrrrabbxyyyypqAzz 0: aaaabxyzpqrrrabbxyyyypqAzz >>>>abcxyzpqrrrabbxyyyypqAzz 0: abcxyzpqrrrabbxyyyypqAzz *** Failers No match abxyzpqrrabbxyyyypqAzz No match abxyzpqrrrrabbxyyyypqAzz No match abxyzpqrrrabxyyyypqAzz No match aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz No match aaaabcxyzzzzpqrrrabbbxyyypqAzz No match aaabcxyzpqrrrabbxyyyypqqqqqqqAzz No match /^(abc){1,2}zz/ abczz 0: abczz 1: abc abcabczz 0: abcabczz 1: abc *** Failers No match zz No match abcabcabczz No match >>abczz No match /^(b+?|a){1,2}?c/ bc 0: bc 1: b bbc 0: bbc 1: b bbbc 0: bbbc 1: bb bac 0: bac 1: a bbac 0: bbac 1: a aac 0: aac 1: a abbbbbbbbbbbc 0: abbbbbbbbbbbc 1: bbbbbbbbbbb bbbbbbbbbbbac 0: bbbbbbbbbbbac 1: a *** Failers No match aaac No match abbbbbbbbbbbac No match /^(b+|a){1,2}c/ bc 0: bc 1: b bbc 0: bbc 1: bb bbbc 0: bbbc 1: bbb bac 0: bac 1: a bbac 0: bbac 1: a aac 0: aac 1: a abbbbbbbbbbbc 0: abbbbbbbbbbbc 1: bbbbbbbbbbb bbbbbbbbbbbac 0: bbbbbbbbbbbac 1: a *** Failers No match aaac No match abbbbbbbbbbbac No match /^(b+|a){1,2}?bc/ bbc 0: bbc 1: b /^(b*|ba){1,2}?bc/ babc 0: babc 1: ba bbabc 0: bbabc 1: ba bababc 0: bababc 1: ba *** Failers No match bababbc No match babababc No match /^(ba|b*){1,2}?bc/ babc 0: babc 1: ba bbabc 0: bbabc 1: ba babbbc 0: babbbc 1: bb *** Failers No match bababbc No match babababc No match /^\ca\cA\c[\c{\c:/ \x01\x01\e;z 0: \x01\x01\x1b;z /^[ab\]cde]/ athing 0: a bthing 0: b ]thing 0: ] cthing 0: c dthing 0: d ething 0: e *** Failers No match fthing No match [thing No match \\thing No match /^[]cde]/ ]thing 0: ] cthing 0: c dthing 0: d ething 0: e *** Failers No match athing No match fthing No match /^[^ab\]cde]/ fthing 0: f [thing 0: [ \\thing 0: \ *** Failers 0: * athing No match bthing No match ]thing No match cthing No match dthing No match ething No match /^[^]cde]/ athing 0: a fthing 0: f *** Failers 0: * ]thing No match cthing No match dthing No match ething No match /^\/ 0: \x81 /^ÿ/ ÿ 0: \xff /^[0-9]+$/ 0 0: 0 1 0: 1 2 0: 2 3 0: 3 4 0: 4 5 0: 5 6 0: 6 7 0: 7 8 0: 8 9 0: 9 10 0: 10 100 0: 100 *** Failers No match abc No match /^.*nter/ enter 0: enter inter 0: inter uponter 0: uponter /b*c*b+/ bbbb 0: bbbb /^xxx[0-9]+$/ xxx0 0: xxx0 xxx1234 0: xxx1234 *** Failers No match xxx No match /^.+[0-9][0-9][0-9]$/ x123 0: x123 xx123 0: xx123 123456 0: 123456 *** Failers No match 123 No match x1234 0: x1234 /^.+?[0-9][0-9][0-9]$/ x123 0: x123 xx123 0: xx123 123456 0: 123456 *** Failers No match 123 No match x1234 0: x1234 /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ abc!pqr=apquxz.ixr.zzz.ac.uk 0: abc!pqr=apquxz.ixr.zzz.ac.uk 1: abc 2: pqr *** Failers No match !pqr=apquxz.ixr.zzz.ac.uk No match abc!=apquxz.ixr.zzz.ac.uk No match abc!pqr=apquxz:ixr.zzz.ac.uk No match abc!pqr=apquxz.ixr.zzz.ac.ukk No match /:/ Well, we need a colon: somewhere 0: : *** Failers No match Fail if we don't No match /([\da-f:]+)$/i 0abc 0: 0abc 1: 0abc abc 0: abc 1: abc fed 0: fed 1: fed E 0: E 1: E :: 0: :: 1: :: 5f03:12C0::932e 0: 5f03:12C0::932e 1: 5f03:12C0::932e fed def 0: def 1: def Any old stuff 0: ff 1: ff *** Failers No match 0zzz No match gzzz No match fed\x20 No match Any old rubbish No match /^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ .1.2.3 0: .1.2.3 1: 1 2: 2 3: 3 A.12.123.0 0: A.12.123.0 1: 12 2: 123 3: 0 *** Failers No match .1.2.3333 No match 1.2.3 No match 1234.2.3 No match /^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ 1 IN SOA non-sp1 non-sp2( 0: 1 IN SOA non-sp1 non-sp2( 1: 1 2: non-sp1 3: non-sp2 1 IN SOA non-sp1 non-sp2 ( 0: 1 IN SOA non-sp1 non-sp2 ( 1: 1 2: non-sp1 3: non-sp2 *** Failers No match 1IN SOA non-sp1 non-sp2( No match /^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ a. 0: a. Z. 0: Z. 2. 0: 2. ab-c.pq-r. 0: ab-c.pq-r. 1: .pq-r sxk.zzz.ac.uk. 0: sxk.zzz.ac.uk. 1: .uk x-.y-. 0: x-.y-. 1: .y- *** Failers No match -abc.peq. No match /^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ *.a 0: *.a *.b0-a 0: *.b0-a 1: 0-a *.c3-b.c 0: *.c3-b.c 1: 3-b 2: .c *.c-a.b-c 0: *.c-a.b-c 1: -a 2: .b-c 3: -c *** Failers No match *.0 No match *.a- No match *.a-b.c- No match *.c-a.0-c No match /^(?=ab(de))(abd)(e)/ abde 0: abde 1: de 2: abd 3: e /^(?!(ab)de|x)(abd)(f)/ abdf 0: abdf 1: 2: abd 3: f /^(?=(ab(cd)))(ab)/ abcd 0: ab 1: abcd 2: cd 3: ab /^[\da-f](\.[\da-f])*$/i a.b.c.d 0: a.b.c.d 1: .d A.B.C.D 0: A.B.C.D 1: .D a.b.c.1.2.3.C 0: a.b.c.1.2.3.C 1: .C /^\".*\"\s*(;.*)?$/ \"1234\" 0: "1234" \"abcd\" ; 0: "abcd" ; 1: ; \"\" ; rhubarb 0: "" ; rhubarb 1: ; rhubarb *** Failers No match \"1234\" : things No match /^$/ \ 0: *** Failers No match / ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x ab c 0: ab c *** Failers No match abc No match ab cde No match /(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ ab c 0: ab c *** Failers No match abc No match ab cde No match /^ a\ b[c ]d $/x a bcd 0: a bcd a b d 0: a b d *** Failers No match abcd No match ab d No match /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ abcdefhijklm 0: abcdefhijklm 1: abc 2: bc 3: c 4: def 5: ef 6: f 7: hij 8: ij 9: j 10: klm 11: lm 12: m /^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ abcdefhijklm 0: abcdefhijklm 1: bc 2: c 3: ef 4: f 5: ij 6: j 7: lm 8: m /^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ a+ Z0+\x08\n\x1d\x12 0: a+ Z0+\x08\x0a\x1d\x12 /^[.^$|()*+?{,}]+/ .^\$(*+)|{?,?} 0: .^$(*+)|{?,?} /^a*\w/ z 0: z az 0: az aaaz 0: aaaz a 0: a aa 0: aa aaaa 0: aaaa a+ 0: a aa+ 0: aa /^a*?\w/ z 0: z az 0: a aaaz 0: a a 0: a aa 0: a aaaa 0: a a+ 0: a aa+ 0: a /^a+\w/ az 0: az aaaz 0: aaaz aa 0: aa aaaa 0: aaaa aa+ 0: aa /^a+?\w/ az 0: az aaaz 0: aa aa 0: aa aaaa 0: aa aa+ 0: aa /^\d{8}\w{2,}/ 1234567890 0: 1234567890 12345678ab 0: 12345678ab 12345678__ 0: 12345678__ *** Failers No match 1234567 No match /^[aeiou\d]{4,5}$/ uoie 0: uoie 1234 0: 1234 12345 0: 12345 aaaaa 0: aaaaa *** Failers No match 123456 No match /^[aeiou\d]{4,5}?/ uoie 0: uoie 1234 0: 1234 12345 0: 1234 aaaaa 0: aaaa 123456 0: 1234 /\A(abc|def)=(\1){2,3}\Z/ abc=abcabc 0: abc=abcabc 1: abc 2: abc def=defdefdef 0: def=defdefdef 1: def 2: def *** Failers No match abc=defdef No match /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ abcdefghijkcda2 0: abcdefghijkcda2 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k 12: cd abcdefghijkkkkcda2 0: abcdefghijkkkkcda2 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k 12: cd /(cat(a(ract|tonic)|erpillar)) \1()2(3)/ cataract cataract23 0: cataract cataract23 1: cataract 2: aract 3: ract 4: 5: 3 catatonic catatonic23 0: catatonic catatonic23 1: catatonic 2: atonic 3: tonic 4: 5: 3 caterpillar caterpillar23 0: caterpillar caterpillar23 1: caterpillar 2: erpillar 3: 4: 5: 3 /^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ From abcd Mon Sep 01 12:33:02 1997 0: From abcd Mon Sep 01 12:33 1: abcd /^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ From abcd Mon Sep 01 12:33:02 1997 0: From abcd Mon Sep 01 12:33 1: Sep From abcd Mon Sep 1 12:33:02 1997 0: From abcd Mon Sep 1 12:33 1: Sep *** Failers No match From abcd Sep 01 12:33:02 1997 No match /^12.34/s 12\n34 0: 12\x0a34 12\r34 0: 12\x0d34 /\w+(?=\t)/ the quick brown\t fox 0: brown /foo(?!bar)(.*)/ foobar is foolish see? 0: foolish see? 1: lish see? /(?:(?!foo)...|^.{0,2})bar(.*)/ foobar crowbar etc 0: rowbar etc 1: etc barrel 0: barrel 1: rel 2barrel 0: 2barrel 1: rel A barrel 0: A barrel 1: rel /^(\D*)(?=\d)(?!123)/ abc456 0: abc 1: abc *** Failers No match abc123 No match /^1234(?# test newlines inside)/ 1234 0: 1234 /^1234 #comment in extended re /x 1234 0: 1234 /#rhubarb abcd/x abcd 0: abcd /^abcd#rhubarb/x abcd 0: abcd /^(a)\1{2,3}(.)/ aaab 0: aaab 1: a 2: b aaaab 0: aaaab 1: a 2: b aaaaab 0: aaaaa 1: a 2: a aaaaaab 0: aaaaa 1: a 2: a /(?!^)abc/ the abc 0: abc *** Failers No match abc No match /(?=^)abc/ abc 0: abc *** Failers No match the abc No match /^[ab]{1,3}(ab*|b)/ aabbbbb 0: aabb 1: b /^[ab]{1,3}?(ab*|b)/ aabbbbb 0: aabbbbb 1: abbbbb /^[ab]{1,3}?(ab*?|b)/ aabbbbb 0: aa 1: a /^[ab]{1,3}(ab*?|b)/ aabbbbb 0: aabb 1: b / (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # optional leading comment (?: (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # initial word (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) )* # further okay, if led by a period (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* # address | # or (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # one word, optionally followed by.... (?: [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) | # comments, or... " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote # quoted strings )* < (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # leading < (?: @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* , (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* )* # further okay, if led by comma : # closing colon (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* )? # optional route (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # initial word (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) )* # further okay, if led by a period (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* # address spec (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* > # trailing > # name and address ) (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # optional trailing comment /x Alan Other 0: Alan Other 0: user@dom.ain user\@dom.ain 0: user@dom.ain \"A. Other\" (a comment) 0: "A. Other" (a comment) A. Other (a comment) 0: Other (a comment) \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # additional words )* @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* # address | # or (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) # leading word [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces (?: (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) | " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " ) # "special" comment or quoted string [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" )* < [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # < (?: @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* (?: , [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* )* # additional domains : [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )? # optional route (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # additional words )* @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* # address spec > # > # name and address ) /x Alan Other 0: Alan Other 0: user@dom.ain user\@dom.ain 0: user@dom.ain \"A. Other\" (a comment) 0: "A. Other" A. Other (a comment) 0: Other \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay A missing angle ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff /P[^*]TAIRE[^*]{1,6}?LL/ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx 0: PSTAIREISLL /P[^*]TAIRE[^*]{1,}?LL/ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx 0: PSTAIREISLL /(\.\d\d[1-9]?)\d+/ 1.230003938 0: .230003938 1: .23 1.875000282 0: .875000282 1: .875 1.235 0: .235 1: .23 /(\.\d\d((?=0)|\d(?=\d)))/ 1.230003938 0: .23 1: .23 2: 1.875000282 0: .875 1: .875 2: 5 *** Failers No match 1.235 No match /a(?)b/ ab 0: ab /\b(foo)\s+(\w+)/i Food is on the foo table 0: foo table 1: foo 2: table /foo(.*)bar/ The food is under the bar in the barn. 0: food is under the bar in the bar 1: d is under the bar in the /foo(.*?)bar/ The food is under the bar in the barn. 0: food is under the bar 1: d is under the /(.*)(\d*)/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 53147 2: /(.*)(\d+)/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*?)(\d*)/ I have 2 numbers: 53147 0: 1: 2: /(.*?)(\d+)/ I have 2 numbers: 53147 0: I have 2 1: I have 2: 2 /(.*)(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*?)(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /(.*)\b(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /(.*\D)(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /^\D*(?!123)/ ABC123 0: AB /^(\D*)(?=\d)(?!123)/ ABC445 0: ABC 1: ABC *** Failers No match ABC123 No match /^[W-]46]/ W46]789 0: W46] -46]789 0: -46] *** Failers No match Wall No match Zebra No match 42 No match [abcd] No match ]abcd[ No match /^[W-\]46]/ W46]789 0: W Wall 0: W Zebra 0: Z Xylophone 0: X 42 0: 4 [abcd] 0: [ ]abcd[ 0: ] \\backslash 0: \ *** Failers No match -46]789 No match well No match /\d\d\/\d\d\/\d\d\d\d/ 01/01/2000 0: 01/01/2000 /word (?:[a-zA-Z0-9]+ ){0,10}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark otherword 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword *** Failers No match word cat dog elephant mussel cow horse canary baboon snake shark No match /word (?:[a-zA-Z0-9]+ ){0,30}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope otherword 0: word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope otherword *** Failers No match word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope No match word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope oops too many No match /^(a){0,0}/ bcd 0: abc 0: aab 0: /^(a){0,1}/ bcd 0: abc 0: a 1: a aab 0: a 1: a /^(a){0,2}/ bcd 0: abc 0: a 1: a aab 0: aa 1: a /^(a){0,3}/ bcd 0: abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a /^(a){0,}/ bcd 0: abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a aaaaaaaa 0: aaaaaaaa 1: a /^(a){1,1}/ abc 0: a 1: a aab 0: a 1: a *** Failers No match bcd No match /^(a){1,2}/ abc 0: a 1: a aab 0: aa 1: a *** Failers No match bcd No match /^(a){1,3}/ abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a *** Failers No match bcd No match /^(a){1,}/ abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a aaaaaaaa 0: aaaaaaaa 1: a *** Failers No match bcd No match /.*\.gif/ borfle\nbib.gif\nno 0: bib.gif /.{0,}\.gif/ borfle\nbib.gif\nno 0: bib.gif /.*\.gif/m borfle\nbib.gif\nno 0: bib.gif /.*\.gif/s borfle\nbib.gif\nno 0: borfle\x0abib.gif /.*\.gif/ms borfle\nbib.gif\nno 0: borfle\x0abib.gif /.*$/ borfle\nbib.gif\nno 0: no /.*$/m borfle\nbib.gif\nno 0: borfle /.*$/s borfle\nbib.gif\nno 0: borfle\x0abib.gif\x0ano /.*$/ms borfle\nbib.gif\nno 0: borfle\x0abib.gif\x0ano /.*$/ borfle\nbib.gif\nno\n 0: no /.*$/m borfle\nbib.gif\nno\n 0: borfle /.*$/s borfle\nbib.gif\nno\n 0: borfle\x0abib.gif\x0ano\x0a /.*$/ms borfle\nbib.gif\nno\n 0: borfle\x0abib.gif\x0ano\x0a /(.*X|^B)/ abcde\n1234Xyz 0: 1234X 1: 1234X BarFoo 0: B 1: B *** Failers No match abcde\nBar No match /(.*X|^B)/m abcde\n1234Xyz 0: 1234X 1: 1234X BarFoo 0: B 1: B abcde\nBar 0: B 1: B /(.*X|^B)/s abcde\n1234Xyz 0: abcde\x0a1234X 1: abcde\x0a1234X BarFoo 0: B 1: B *** Failers No match abcde\nBar No match /(.*X|^B)/ms abcde\n1234Xyz 0: abcde\x0a1234X 1: abcde\x0a1234X BarFoo 0: B 1: B abcde\nBar 0: B 1: B /(?s)(.*X|^B)/ abcde\n1234Xyz 0: abcde\x0a1234X 1: abcde\x0a1234X BarFoo 0: B 1: B *** Failers No match abcde\nBar No match /(?s:.*X|^B)/ abcde\n1234Xyz 0: abcde\x0a1234X BarFoo 0: B *** Failers No match abcde\nBar No match /^.*B/ **** Failers No match abc\nB No match /(?s)^.*B/ abc\nB 0: abc\x0aB /(?m)^.*B/ abc\nB 0: B /(?ms)^.*B/ abc\nB 0: abc\x0aB /(?ms)^B/ abc\nB 0: B /(?s)B$/ B\n 0: B /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ 123456654321 0: 123456654321 /^\d\d\d\d\d\d\d\d\d\d\d\d/ 123456654321 0: 123456654321 /^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ 123456654321 0: 123456654321 /^[abc]{12}/ abcabcabcabc 0: abcabcabcabc /^[a-c]{12}/ abcabcabcabc 0: abcabcabcabc /^(a|b|c){12}/ abcabcabcabc 0: abcabcabcabc 1: c /^[abcdefghijklmnopqrstuvwxy0123456789]/ n 0: n *** Failers No match z No match /abcde{0,0}/ abcd 0: abcd *** Failers No match abce No match /ab[cd]{0,0}e/ abe 0: abe *** Failers No match abcde No match /ab(c){0,0}d/ abd 0: abd *** Failers No match abcd No match /a(b*)/ a 0: a 1: ab 0: ab 1: b abbbb 0: abbbb 1: bbbb *** Failers 0: a 1: bbbbb No match /ab\d{0}e/ abe 0: abe *** Failers No match ab1e No match /"([^\\"]+|\\.)*"/ the \"quick\" brown fox 0: "quick" 1: quick \"the \\\"quick\\\" brown fox\" 0: "the \"quick\" brown fox" 1: brown fox /.*?/g+ abc 0: 0+ abc 0: a 0+ bc 0: 0+ bc 0: b 0+ c 0: 0+ c 0: c 0+ 0: 0+ /\b/g+ abc 0: 0+ abc 0: 0+ /\b/+g abc 0: 0+ abc 0: 0+ //g abc 0: 0: 0: 0: /]{0,})>]{0,})>([\d]{0,}\.)(.*)((
    ([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is 43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide 0: 43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide 1: BGCOLOR='#DBE9E9' 2: align=left valign=top 3: 43. 4: Word Processor
    (N-1286) 5: 6: 7: 8: align=left valign=top 9: Lega lstaff.com 10: align=left valign=top 11: CA - Statewide /a[^a]b/ acb 0: acb a\nb 0: a\x0ab /a.b/ acb 0: acb *** Failers No match a\nb No match /a[^a]b/s acb 0: acb a\nb 0: a\x0ab /a.b/s acb 0: acb a\nb 0: a\x0ab /^(b+?|a){1,2}?c/ bac 0: bac 1: a bbac 0: bbac 1: a bbbac 0: bbbac 1: a bbbbac 0: bbbbac 1: a bbbbbac 0: bbbbbac 1: a /^(b+|a){1,2}?c/ bac 0: bac 1: a bbac 0: bbac 1: a bbbac 0: bbbac 1: a bbbbac 0: bbbbac 1: a bbbbbac 0: bbbbbac 1: a /(?!\A)x/m a\bx\n 0: x *** Failers No match x\nb\n No match /\x0{ab}/ \0{ab} 0: \x00{ab} /(A|B)*?CD/ CD 0: CD /(A|B)*CD/ CD 0: CD /(AB)*?\1/ ABABAB 0: ABAB 1: AB /(AB)*\1/ ABABAB 0: ABABAB 1: AB / End of testinput1 / sed-3.62/testsuite/pcre1.inp0000644000076600007660000015116010143133572012732 00000000000000/the quick brown fox/ the quick brown fox What do you know about the quick brown fox? *** Failers The quick brown FOX What do you know about THE QUICK BROWN FOX? /The quick brown fox/i the quick brown fox The quick brown FOX What do you know about the quick brown fox? What do you know about THE QUICK BROWN FOX? /abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ abcd\t\n\r\f\a\e9;\$\\?caxyz /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ abxyzpqrrrabbxyyyypqAzz abxyzpqrrrabbxyyyypqAzz aabxyzpqrrrabbxyyyypqAzz aaabxyzpqrrrabbxyyyypqAzz aaaabxyzpqrrrabbxyyyypqAzz abcxyzpqrrrabbxyyyypqAzz aabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypAzz aaabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypqqAzz aaabcxyzpqrrrabbxyyyypqqqAzz aaabcxyzpqrrrabbxyyyypqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqqAzz aaaabcxyzpqrrrabbxyyyypqAzz abxyzzpqrrrabbxyyyypqAzz aabxyzzzpqrrrabbxyyyypqAzz aaabxyzzzzpqrrrabbxyyyypqAzz aaaabxyzzzzpqrrrabbxyyyypqAzz abcxyzzpqrrrabbxyyyypqAzz aabcxyzzzpqrrrabbxyyyypqAzz aaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyypqAzz aaabcxyzpqrrrabbxyyyypABzz aaabcxyzpqrrrabbxyyyypABBzz >>>aaabxyzpqrrrabbxyyyypqAzz >aaaabxyzpqrrrabbxyyyypqAzz >>>>abcxyzpqrrrabbxyyyypqAzz *** Failers abxyzpqrrabbxyyyypqAzz abxyzpqrrrrabbxyyyypqAzz abxyzpqrrrabxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyypqAzz aaabcxyzpqrrrabbxyyyypqqqqqqqAzz /^(abc){1,2}zz/ abczz abcabczz *** Failers zz abcabcabczz >>abczz /^(b+?|a){1,2}?c/ bc bbc bbbc bac bbac aac abbbbbbbbbbbc bbbbbbbbbbbac *** Failers aaac abbbbbbbbbbbac /^(b+|a){1,2}c/ bc bbc bbbc bac bbac aac abbbbbbbbbbbc bbbbbbbbbbbac *** Failers aaac abbbbbbbbbbbac /^(b+|a){1,2}?bc/ bbc /^(b*|ba){1,2}?bc/ babc bbabc bababc *** Failers bababbc babababc /^(ba|b*){1,2}?bc/ babc bbabc babbbc *** Failers bababbc babababc /^\ca\cA\c[\c{\c:/ \x01\x01\e;z /^[ab\]cde]/ athing bthing ]thing cthing dthing ething *** Failers fthing [thing \\thing /^[]cde]/ ]thing cthing dthing ething *** Failers athing fthing /^[^ab\]cde]/ fthing [thing \\thing *** Failers athing bthing ]thing cthing dthing ething /^[^]cde]/ athing fthing *** Failers ]thing cthing dthing ething /^\/ /^ÿ/ ÿ /^[0-9]+$/ 0 1 2 3 4 5 6 7 8 9 10 100 *** Failers abc /^.*nter/ enter inter uponter /b*c*b+/ bbbb /^xxx[0-9]+$/ xxx0 xxx1234 *** Failers xxx /^.+[0-9][0-9][0-9]$/ x123 xx123 123456 *** Failers 123 x1234 /^.+?[0-9][0-9][0-9]$/ x123 xx123 123456 *** Failers 123 x1234 /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ abc!pqr=apquxz.ixr.zzz.ac.uk *** Failers !pqr=apquxz.ixr.zzz.ac.uk abc!=apquxz.ixr.zzz.ac.uk abc!pqr=apquxz:ixr.zzz.ac.uk abc!pqr=apquxz.ixr.zzz.ac.ukk /:/ Well, we need a colon: somewhere *** Failers Fail if we don't /([\da-f:]+)$/i 0abc abc fed E :: 5f03:12C0::932e fed def Any old stuff *** Failers 0zzz gzzz fed\x20 Any old rubbish /^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ .1.2.3 A.12.123.0 *** Failers .1.2.3333 1.2.3 1234.2.3 /^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ 1 IN SOA non-sp1 non-sp2( 1 IN SOA non-sp1 non-sp2 ( *** Failers 1IN SOA non-sp1 non-sp2( /^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ a. Z. 2. ab-c.pq-r. sxk.zzz.ac.uk. x-.y-. *** Failers -abc.peq. /^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ *.a *.b0-a *.c3-b.c *.c-a.b-c *** Failers *.0 *.a- *.a-b.c- *.c-a.0-c /^(?=ab(de))(abd)(e)/ abde /^(?!(ab)de|x)(abd)(f)/ abdf /^(?=(ab(cd)))(ab)/ abcd /^[\da-f](\.[\da-f])*$/i a.b.c.d A.B.C.D a.b.c.1.2.3.C /^\".*\"\s*(;.*)?$/ \"1234\" \"abcd\" ; \"\" ; rhubarb *** Failers \"1234\" : things /^$/ \ *** Failers / ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x ab c *** Failers abc ab cde /(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ ab c *** Failers abc ab cde /^ a\ b[c ]d $/x a bcd a b d *** Failers abcd ab d /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ abcdefhijklm /^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ abcdefhijklm /^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ a+ Z0+\x08\n\x1d\x12 /^[.^$|()*+?{,}]+/ .^\$(*+)|{?,?} /^a*\w/ z az aaaz a aa aaaa a+ aa+ /^a*?\w/ z az aaaz a aa aaaa a+ aa+ /^a+\w/ az aaaz aa aaaa aa+ /^a+?\w/ az aaaz aa aaaa aa+ /^\d{8}\w{2,}/ 1234567890 12345678ab 12345678__ *** Failers 1234567 /^[aeiou\d]{4,5}$/ uoie 1234 12345 aaaaa *** Failers 123456 /^[aeiou\d]{4,5}?/ uoie 1234 12345 aaaaa 123456 /\A(abc|def)=(\1){2,3}\Z/ abc=abcabc def=defdefdef *** Failers abc=defdef /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ abcdefghijkcda2 abcdefghijkkkkcda2 /(cat(a(ract|tonic)|erpillar)) \1()2(3)/ cataract cataract23 catatonic catatonic23 caterpillar caterpillar23 /^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ From abcd Mon Sep 01 12:33:02 1997 /^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ From abcd Mon Sep 01 12:33:02 1997 From abcd Mon Sep 1 12:33:02 1997 *** Failers From abcd Sep 01 12:33:02 1997 /^12.34/s 12\n34 12\r34 /\w+(?=\t)/ the quick brown\t fox /foo(?!bar)(.*)/ foobar is foolish see? /(?:(?!foo)...|^.{0,2})bar(.*)/ foobar crowbar etc barrel 2barrel A barrel /^(\D*)(?=\d)(?!123)/ abc456 *** Failers abc123 /^1234(?# test newlines inside)/ 1234 /^1234 #comment in extended re /x 1234 /#rhubarb abcd/x abcd /^abcd#rhubarb/x abcd /^(a)\1{2,3}(.)/ aaab aaaab aaaaab aaaaaab /(?!^)abc/ the abc *** Failers abc /(?=^)abc/ abc *** Failers the abc /^[ab]{1,3}(ab*|b)/ aabbbbb /^[ab]{1,3}?(ab*|b)/ aabbbbb /^[ab]{1,3}?(ab*?|b)/ aabbbbb /^[ab]{1,3}(ab*?|b)/ aabbbbb / (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # optional leading comment (?: (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # initial word (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) )* # further okay, if led by a period (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* # address | # or (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # one word, optionally followed by.... (?: [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) | # comments, or... " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote # quoted strings )* < (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # leading < (?: @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* , (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* )* # further okay, if led by comma : # closing colon (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* )? # optional route (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # initial word (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) )* # further okay, if led by a period (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* # address spec (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* > # trailing > # name and address ) (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # optional trailing comment /x Alan Other user\@dom.ain \"A. Other\" (a comment) A. Other (a comment) \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # additional words )* @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* # address | # or (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) # leading word [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces (?: (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) | " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " ) # "special" comment or quoted string [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" )* < [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # < (?: @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* (?: , [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* )* # additional domains : [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )? # optional route (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # additional words )* @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* # address spec > # > # name and address ) /x Alan Other user\@dom.ain \"A. Other\" (a comment) A. Other (a comment) \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay A missing angle ]{0,})>]{0,})>([\d]{0,}\.)(.*)((
    ([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is 43.
    Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide /a[^a]b/ acb a\nb /a.b/ acb *** Failers a\nb /a[^a]b/s acb a\nb /a.b/s acb a\nb /^(b+?|a){1,2}?c/ bac bbac bbbac bbbbac bbbbbac /^(b+|a){1,2}?c/ bac bbac bbbac bbbbac bbbbbac /(?!\A)x/m a\bx\n *** Failers x\nb\n /\x0{ab}/ \0{ab} /(A|B)*?CD/ CD /(A|B)*CD/ CD /(AB)*?\1/ ABABAB /(AB)*\1/ ABABAB / End of testinput1 / sed-3.62/testsuite/pcre1p.good0000644000076600007660000021576610143133572013271 00000000000000/the quick brown fox/ the quick brown fox 0: the quick brown fox What do you know about the quick brown fox? 0: the quick brown fox *** Failers No match: POSIX code 17: match failed The quick brown FOX No match: POSIX code 17: match failed What do you know about THE QUICK BROWN FOX? No match: POSIX code 17: match failed /The quick brown fox/i the quick brown fox 0: the quick brown fox The quick brown FOX 0: The quick brown FOX What do you know about the quick brown fox? 0: the quick brown fox What do you know about THE QUICK BROWN FOX? 0: THE QUICK BROWN FOX /abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ abcd\t\n\r\f\a\e9;\$\\?caxyz 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ abxyzpqrrrabbxyyyypqAzz 0: abxyzpqrrrabbxyyyypqAzz abxyzpqrrrabbxyyyypqAzz 0: abxyzpqrrrabbxyyyypqAzz aabxyzpqrrrabbxyyyypqAzz 0: aabxyzpqrrrabbxyyyypqAzz aaabxyzpqrrrabbxyyyypqAzz 0: aaabxyzpqrrrabbxyyyypqAzz aaaabxyzpqrrrabbxyyyypqAzz 0: aaaabxyzpqrrrabbxyyyypqAzz abcxyzpqrrrabbxyyyypqAzz 0: abcxyzpqrrrabbxyyyypqAzz aabcxyzpqrrrabbxyyyypqAzz 0: aabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypAzz 0: aaabcxyzpqrrrabbxyyyypAzz aaabcxyzpqrrrabbxyyyypqAzz 0: aaabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypqqAzz 0: aaabcxyzpqrrrabbxyyyypqqAzz aaabcxyzpqrrrabbxyyyypqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqAzz aaabcxyzpqrrrabbxyyyypqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz aaaabcxyzpqrrrabbxyyyypqAzz 0: aaaabcxyzpqrrrabbxyyyypqAzz abxyzzpqrrrabbxyyyypqAzz 0: abxyzzpqrrrabbxyyyypqAzz aabxyzzzpqrrrabbxyyyypqAzz 0: aabxyzzzpqrrrabbxyyyypqAzz aaabxyzzzzpqrrrabbxyyyypqAzz 0: aaabxyzzzzpqrrrabbxyyyypqAzz aaaabxyzzzzpqrrrabbxyyyypqAzz 0: aaaabxyzzzzpqrrrabbxyyyypqAzz abcxyzzpqrrrabbxyyyypqAzz 0: abcxyzzpqrrrabbxyyyypqAzz aabcxyzzzpqrrrabbxyyyypqAzz 0: aabcxyzzzpqrrrabbxyyyypqAzz aaabcxyzzzzpqrrrabbxyyyypqAzz 0: aaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbxyyyypqAzz 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyypqAzz 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyypqAzz 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz aaabcxyzpqrrrabbxyyyypABzz 0: aaabcxyzpqrrrabbxyyyypABzz aaabcxyzpqrrrabbxyyyypABBzz 0: aaabcxyzpqrrrabbxyyyypABBzz >>>aaabxyzpqrrrabbxyyyypqAzz 0: aaabxyzpqrrrabbxyyyypqAzz >aaaabxyzpqrrrabbxyyyypqAzz 0: aaaabxyzpqrrrabbxyyyypqAzz >>>>abcxyzpqrrrabbxyyyypqAzz 0: abcxyzpqrrrabbxyyyypqAzz *** Failers No match: POSIX code 17: match failed abxyzpqrrabbxyyyypqAzz No match: POSIX code 17: match failed abxyzpqrrrrabbxyyyypqAzz No match: POSIX code 17: match failed abxyzpqrrrabxyyyypqAzz No match: POSIX code 17: match failed aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz No match: POSIX code 17: match failed aaaabcxyzzzzpqrrrabbbxyyypqAzz No match: POSIX code 17: match failed aaabcxyzpqrrrabbxyyyypqqqqqqqAzz No match: POSIX code 17: match failed /^(abc){1,2}zz/ abczz 0: abczz 1: abc abcabczz 0: abcabczz 1: abc *** Failers No match: POSIX code 17: match failed zz No match: POSIX code 17: match failed abcabcabczz No match: POSIX code 17: match failed >>abczz No match: POSIX code 17: match failed /^(b+?|a){1,2}?c/ bc 0: bc 1: b bbc 0: bbc 1: b bbbc 0: bbbc 1: bb bac 0: bac 1: a bbac 0: bbac 1: a aac 0: aac 1: a abbbbbbbbbbbc 0: abbbbbbbbbbbc 1: bbbbbbbbbbb bbbbbbbbbbbac 0: bbbbbbbbbbbac 1: a *** Failers No match: POSIX code 17: match failed aaac No match: POSIX code 17: match failed abbbbbbbbbbbac No match: POSIX code 17: match failed /^(b+|a){1,2}c/ bc 0: bc 1: b bbc 0: bbc 1: bb bbbc 0: bbbc 1: bbb bac 0: bac 1: a bbac 0: bbac 1: a aac 0: aac 1: a abbbbbbbbbbbc 0: abbbbbbbbbbbc 1: bbbbbbbbbbb bbbbbbbbbbbac 0: bbbbbbbbbbbac 1: a *** Failers No match: POSIX code 17: match failed aaac No match: POSIX code 17: match failed abbbbbbbbbbbac No match: POSIX code 17: match failed /^(b+|a){1,2}?bc/ bbc 0: bbc 1: b /^(b*|ba){1,2}?bc/ babc 0: babc 1: ba bbabc 0: bbabc 1: ba bababc 0: bababc 1: ba *** Failers No match: POSIX code 17: match failed bababbc No match: POSIX code 17: match failed babababc No match: POSIX code 17: match failed /^(ba|b*){1,2}?bc/ babc 0: babc 1: ba bbabc 0: bbabc 1: ba babbbc 0: babbbc 1: bb *** Failers No match: POSIX code 17: match failed bababbc No match: POSIX code 17: match failed babababc No match: POSIX code 17: match failed /^\ca\cA\c[\c{\c:/ \x01\x01\e;z 0: \x01\x01\x1b;z /^[ab\]cde]/ athing 0: a bthing 0: b ]thing 0: ] cthing 0: c dthing 0: d ething 0: e *** Failers No match: POSIX code 17: match failed fthing No match: POSIX code 17: match failed [thing No match: POSIX code 17: match failed \\thing No match: POSIX code 17: match failed /^[]cde]/ ]thing 0: ] cthing 0: c dthing 0: d ething 0: e *** Failers No match: POSIX code 17: match failed athing No match: POSIX code 17: match failed fthing No match: POSIX code 17: match failed /^[^ab\]cde]/ fthing 0: f [thing 0: [ \\thing 0: \ *** Failers 0: * athing No match: POSIX code 17: match failed bthing No match: POSIX code 17: match failed ]thing No match: POSIX code 17: match failed cthing No match: POSIX code 17: match failed dthing No match: POSIX code 17: match failed ething No match: POSIX code 17: match failed /^[^]cde]/ athing 0: a fthing 0: f *** Failers 0: * ]thing No match: POSIX code 17: match failed cthing No match: POSIX code 17: match failed dthing No match: POSIX code 17: match failed ething No match: POSIX code 17: match failed /^\/ 0: \x81 /^ÿ/ ÿ 0: \xff /^[0-9]+$/ 0 0: 0 1 0: 1 2 0: 2 3 0: 3 4 0: 4 5 0: 5 6 0: 6 7 0: 7 8 0: 8 9 0: 9 10 0: 10 100 0: 100 *** Failers No match: POSIX code 17: match failed abc No match: POSIX code 17: match failed /^.*nter/ enter 0: enter inter 0: inter uponter 0: uponter /b*c*b+/ bbbb 0: bbbb /^xxx[0-9]+$/ xxx0 0: xxx0 xxx1234 0: xxx1234 *** Failers No match: POSIX code 17: match failed xxx No match: POSIX code 17: match failed /^.+[0-9][0-9][0-9]$/ x123 0: x123 xx123 0: xx123 123456 0: 123456 *** Failers No match: POSIX code 17: match failed 123 No match: POSIX code 17: match failed x1234 0: x1234 /^.+?[0-9][0-9][0-9]$/ x123 0: x123 xx123 0: xx123 123456 0: 123456 *** Failers No match: POSIX code 17: match failed 123 No match: POSIX code 17: match failed x1234 0: x1234 /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ abc!pqr=apquxz.ixr.zzz.ac.uk 0: abc!pqr=apquxz.ixr.zzz.ac.uk 1: abc 2: pqr *** Failers No match: POSIX code 17: match failed !pqr=apquxz.ixr.zzz.ac.uk No match: POSIX code 17: match failed abc!=apquxz.ixr.zzz.ac.uk No match: POSIX code 17: match failed abc!pqr=apquxz:ixr.zzz.ac.uk No match: POSIX code 17: match failed abc!pqr=apquxz.ixr.zzz.ac.ukk No match: POSIX code 17: match failed /:/ Well, we need a colon: somewhere 0: : *** Failers No match: POSIX code 17: match failed Fail if we don't No match: POSIX code 17: match failed /([\da-f:]+)$/i 0abc 0: 0abc 1: 0abc abc 0: abc 1: abc fed 0: fed 1: fed E 0: E 1: E :: 0: :: 1: :: 5f03:12C0::932e 0: 5f03:12C0::932e 1: 5f03:12C0::932e fed def 0: def 1: def Any old stuff 0: ff 1: ff *** Failers No match: POSIX code 17: match failed 0zzz No match: POSIX code 17: match failed gzzz No match: POSIX code 17: match failed fed\x20 No match: POSIX code 17: match failed Any old rubbish No match: POSIX code 17: match failed /^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ .1.2.3 0: .1.2.3 1: 1 2: 2 3: 3 A.12.123.0 0: A.12.123.0 1: 12 2: 123 3: 0 *** Failers No match: POSIX code 17: match failed .1.2.3333 No match: POSIX code 17: match failed 1.2.3 No match: POSIX code 17: match failed 1234.2.3 No match: POSIX code 17: match failed /^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ 1 IN SOA non-sp1 non-sp2( 0: 1 IN SOA non-sp1 non-sp2( 1: 1 2: non-sp1 3: non-sp2 1 IN SOA non-sp1 non-sp2 ( 0: 1 IN SOA non-sp1 non-sp2 ( 1: 1 2: non-sp1 3: non-sp2 *** Failers No match: POSIX code 17: match failed 1IN SOA non-sp1 non-sp2( No match: POSIX code 17: match failed /^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ a. 0: a. Z. 0: Z. 2. 0: 2. ab-c.pq-r. 0: ab-c.pq-r. 1: .pq-r sxk.zzz.ac.uk. 0: sxk.zzz.ac.uk. 1: .uk x-.y-. 0: x-.y-. 1: .y- *** Failers No match: POSIX code 17: match failed -abc.peq. No match: POSIX code 17: match failed /^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ *.a 0: *.a *.b0-a 0: *.b0-a 1: 0-a *.c3-b.c 0: *.c3-b.c 1: 3-b 2: .c *.c-a.b-c 0: *.c-a.b-c 1: -a 2: .b-c 3: -c *** Failers No match: POSIX code 17: match failed *.0 No match: POSIX code 17: match failed *.a- No match: POSIX code 17: match failed *.a-b.c- No match: POSIX code 17: match failed *.c-a.0-c No match: POSIX code 17: match failed /^(?=ab(de))(abd)(e)/ abde 0: abde 1: de 2: abd 3: e /^(?!(ab)de|x)(abd)(f)/ abdf 0: abdf 2: abd 3: f /^(?=(ab(cd)))(ab)/ abcd 0: ab 1: abcd 2: cd 3: ab /^[\da-f](\.[\da-f])*$/i a.b.c.d 0: a.b.c.d 1: .d A.B.C.D 0: A.B.C.D 1: .D a.b.c.1.2.3.C 0: a.b.c.1.2.3.C 1: .C /^\".*\"\s*(;.*)?$/ \"1234\" 0: "1234" \"abcd\" ; 0: "abcd" ; 1: ; \"\" ; rhubarb 0: "" ; rhubarb 1: ; rhubarb *** Failers No match: POSIX code 17: match failed \"1234\" : things No match: POSIX code 17: match failed /^$/ \ 0: *** Failers No match: POSIX code 17: match failed / ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x ab c 0: ab c *** Failers No match: POSIX code 17: match failed abc No match: POSIX code 17: match failed ab cde No match: POSIX code 17: match failed /(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ ab c 0: ab c *** Failers No match: POSIX code 17: match failed abc No match: POSIX code 17: match failed ab cde No match: POSIX code 17: match failed /^ a\ b[c ]d $/x a bcd 0: a bcd a b d 0: a b d *** Failers No match: POSIX code 17: match failed abcd No match: POSIX code 17: match failed ab d No match: POSIX code 17: match failed /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ abcdefhijklm 0: abcdefhijklm 1: abc 2: bc 3: c 4: def 5: ef 6: f 7: hij 8: ij 9: j 10: klm 11: lm 12: m /^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ abcdefhijklm 0: abcdefhijklm 1: bc 2: c 3: ef 4: f 5: ij 6: j 7: lm 8: m /^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ a+ Z0+\x08\n\x1d\x12 0: a+ Z0+\x08\x0a\x1d\x12 /^[.^$|()*+?{,}]+/ .^\$(*+)|{?,?} 0: .^$(*+)|{?,?} /^a*\w/ z 0: z az 0: az aaaz 0: aaaz a 0: a aa 0: aa aaaa 0: aaaa a+ 0: a aa+ 0: aa /^a*?\w/ z 0: z az 0: a aaaz 0: a a 0: a aa 0: a aaaa 0: a a+ 0: a aa+ 0: a /^a+\w/ az 0: az aaaz 0: aaaz aa 0: aa aaaa 0: aaaa aa+ 0: aa /^a+?\w/ az 0: az aaaz 0: aa aa 0: aa aaaa 0: aa aa+ 0: aa /^\d{8}\w{2,}/ 1234567890 0: 1234567890 12345678ab 0: 12345678ab 12345678__ 0: 12345678__ *** Failers No match: POSIX code 17: match failed 1234567 No match: POSIX code 17: match failed /^[aeiou\d]{4,5}$/ uoie 0: uoie 1234 0: 1234 12345 0: 12345 aaaaa 0: aaaaa *** Failers No match: POSIX code 17: match failed 123456 No match: POSIX code 17: match failed /^[aeiou\d]{4,5}?/ uoie 0: uoie 1234 0: 1234 12345 0: 1234 aaaaa 0: aaaa 123456 0: 1234 /\A(abc|def)=(\1){2,3}\Z/ abc=abcabc 0: abc=abcabc 1: abc 2: abc def=defdefdef 0: def=defdefdef 1: def 2: def *** Failers No match: POSIX code 17: match failed abc=defdef No match: POSIX code 17: match failed /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ abcdefghijkcda2 0: abcdefghijkcda2 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k 12: cd abcdefghijkkkkcda2 0: abcdefghijkkkkcda2 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k 12: cd /(cat(a(ract|tonic)|erpillar)) \1()2(3)/ cataract cataract23 0: cataract cataract23 1: cataract 2: aract 3: ract 4: 5: 3 catatonic catatonic23 0: catatonic catatonic23 1: catatonic 2: atonic 3: tonic 4: 5: 3 caterpillar caterpillar23 0: caterpillar caterpillar23 1: caterpillar 2: erpillar 4: 5: 3 /^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ From abcd Mon Sep 01 12:33:02 1997 0: From abcd Mon Sep 01 12:33 1: abcd /^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ From abcd Mon Sep 01 12:33:02 1997 0: From abcd Mon Sep 01 12:33 1: Sep From abcd Mon Sep 1 12:33:02 1997 0: From abcd Mon Sep 1 12:33 1: Sep *** Failers No match: POSIX code 17: match failed From abcd Sep 01 12:33:02 1997 No match: POSIX code 17: match failed /^12.34/s 12\n34 0: 12\x0a34 12\r34 0: 12\x0d34 /\w+(?=\t)/ the quick brown\t fox 0: brown /foo(?!bar)(.*)/ foobar is foolish see? 0: foolish see? 1: lish see? /(?:(?!foo)...|^.{0,2})bar(.*)/ foobar crowbar etc 0: rowbar etc 1: etc barrel 0: barrel 1: rel 2barrel 0: 2barrel 1: rel A barrel 0: A barrel 1: rel /^(\D*)(?=\d)(?!123)/ abc456 0: abc 1: abc *** Failers No match: POSIX code 17: match failed abc123 No match: POSIX code 17: match failed /^1234(?# test newlines inside)/ 1234 0: 1234 /^1234 #comment in extended re /x 1234 0: 1234 /#rhubarb abcd/x abcd 0: abcd /^abcd#rhubarb/x abcd 0: abcd /^(a)\1{2,3}(.)/ aaab 0: aaab 1: a 2: b aaaab 0: aaaab 1: a 2: b aaaaab 0: aaaaa 1: a 2: a aaaaaab 0: aaaaa 1: a 2: a /(?!^)abc/ the abc 0: abc *** Failers No match: POSIX code 17: match failed abc No match: POSIX code 17: match failed /(?=^)abc/ abc 0: abc *** Failers No match: POSIX code 17: match failed the abc No match: POSIX code 17: match failed /^[ab]{1,3}(ab*|b)/ aabbbbb 0: aabb 1: b /^[ab]{1,3}?(ab*|b)/ aabbbbb 0: aabbbbb 1: abbbbb /^[ab]{1,3}?(ab*?|b)/ aabbbbb 0: aa 1: a /^[ab]{1,3}(ab*?|b)/ aabbbbb 0: aabb 1: b / (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # optional leading comment (?: (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # initial word (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) )* # further okay, if led by a period (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* # address | # or (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # one word, optionally followed by.... (?: [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) | # comments, or... " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote # quoted strings )* < (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # leading < (?: @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* , (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* )* # further okay, if led by comma : # closing colon (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* )? # optional route (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) # initial word (?: (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | " (?: # opening quote... [^\\\x80-\xff\n\015"] # Anything except backslash and quote | # or \\ [^\x80-\xff] # Escaped something (something != CR) )* " # closing quote ) )* # further okay, if led by a period (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* @ (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # initial subdomain (?: # (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* \. # if led by a period... (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) # ...further okay )* # address spec (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* > # trailing > # name and address ) (?: [\040\t] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* \) )* # optional trailing comment /x Alan Other 0: Alan Other 0: user@dom.ain user\@dom.ain 0: user@dom.ain \"A. Other\" (a comment) 0: "A. Other" (a comment) A. Other (a comment) 0: Other (a comment) \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # additional words )* @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* # address | # or (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) # leading word [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces (?: (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) | " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " ) # "special" comment or quoted string [^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" )* < [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # < (?: @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* (?: , [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* )* # additional domains : [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )? # optional route (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom # Atom | # or " # " [^\\\x80-\xff\n\015"] * # normal (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* " # " # Quoted string ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # additional words )* @ [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments (?: \. [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. (?: [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... (?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom | \[ # [ (?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff \] # ] ) [\040\t]* # Nab whitespace. (?: \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: # ( (?: \\ [^\x80-\xff] | \( # ( [^\\\x80-\xff\n\015()] * # normal* (?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* \) # ) ) # special [^\\\x80-\xff\n\015()] * # normal* )* # )* \) # ) [\040\t]* )* # If comment found, allow more spaces. # optional trailing comments )* # address spec > # > # name and address ) /x Alan Other 0: Alan Other 0: user@dom.ain user\@dom.ain 0: user@dom.ain \"A. Other\" (a comment) 0: "A. Other" A. Other (a comment) 0: Other \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay A missing angle ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff /P[^*]TAIRE[^*]{1,6}?LL/ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx 0: PSTAIREISLL /P[^*]TAIRE[^*]{1,}?LL/ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx 0: PSTAIREISLL /(\.\d\d[1-9]?)\d+/ 1.230003938 0: .230003938 1: .23 1.875000282 0: .875000282 1: .875 1.235 0: .235 1: .23 /(\.\d\d((?=0)|\d(?=\d)))/ 1.230003938 0: .23 1: .23 2: 1.875000282 0: .875 1: .875 2: 5 *** Failers No match: POSIX code 17: match failed 1.235 No match: POSIX code 17: match failed /a(?)b/ ab 0: ab /\b(foo)\s+(\w+)/i Food is on the foo table 0: foo table 1: foo 2: table /foo(.*)bar/ The food is under the bar in the barn. 0: food is under the bar in the bar 1: d is under the bar in the /foo(.*?)bar/ The food is under the bar in the barn. 0: food is under the bar 1: d is under the /(.*)(\d*)/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 53147 2: /(.*)(\d+)/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*?)(\d*)/ I have 2 numbers: 53147 0: 1: 2: /(.*?)(\d+)/ I have 2 numbers: 53147 0: I have 2 1: I have 2: 2 /(.*)(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*?)(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /(.*)\b(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /(.*\D)(\d+)$/ I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /^\D*(?!123)/ ABC123 0: AB /^(\D*)(?=\d)(?!123)/ ABC445 0: ABC 1: ABC *** Failers No match: POSIX code 17: match failed ABC123 No match: POSIX code 17: match failed /^[W-]46]/ W46]789 0: W46] -46]789 0: -46] *** Failers No match: POSIX code 17: match failed Wall No match: POSIX code 17: match failed Zebra No match: POSIX code 17: match failed 42 No match: POSIX code 17: match failed [abcd] No match: POSIX code 17: match failed ]abcd[ No match: POSIX code 17: match failed /^[W-\]46]/ W46]789 0: W Wall 0: W Zebra 0: Z Xylophone 0: X 42 0: 4 [abcd] 0: [ ]abcd[ 0: ] \\backslash 0: \ *** Failers No match: POSIX code 17: match failed -46]789 No match: POSIX code 17: match failed well No match: POSIX code 17: match failed /\d\d\/\d\d\/\d\d\d\d/ 01/01/2000 0: 01/01/2000 /word (?:[a-zA-Z0-9]+ ){0,10}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark otherword 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword *** Failers No match: POSIX code 17: match failed word cat dog elephant mussel cow horse canary baboon snake shark No match: POSIX code 17: match failed /word (?:[a-zA-Z0-9]+ ){0,30}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope otherword 0: word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope otherword *** Failers No match: POSIX code 17: match failed word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope No match: POSIX code 17: match failed word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope oops too many No match: POSIX code 17: match failed /^(a){0,0}/ bcd 0: abc 0: aab 0: /^(a){0,1}/ bcd 0: abc 0: a 1: a aab 0: a 1: a /^(a){0,2}/ bcd 0: abc 0: a 1: a aab 0: aa 1: a /^(a){0,3}/ bcd 0: abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a /^(a){0,}/ bcd 0: abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a aaaaaaaa 0: aaaaaaaa 1: a /^(a){1,1}/ abc 0: a 1: a aab 0: a 1: a *** Failers No match: POSIX code 17: match failed bcd No match: POSIX code 17: match failed /^(a){1,2}/ abc 0: a 1: a aab 0: aa 1: a *** Failers No match: POSIX code 17: match failed bcd No match: POSIX code 17: match failed /^(a){1,3}/ abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a *** Failers No match: POSIX code 17: match failed bcd No match: POSIX code 17: match failed /^(a){1,}/ abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a aaaaaaaa 0: aaaaaaaa 1: a *** Failers No match: POSIX code 17: match failed bcd No match: POSIX code 17: match failed /.*\.gif/ borfle\nbib.gif\nno 0: bib.gif /.{0,}\.gif/ borfle\nbib.gif\nno 0: bib.gif /.*\.gif/m borfle\nbib.gif\nno 0: bib.gif /.*\.gif/s borfle\nbib.gif\nno 0: borfle\x0abib.gif /.*\.gif/ms borfle\nbib.gif\nno 0: borfle\x0abib.gif /.*$/ borfle\nbib.gif\nno 0: no /.*$/m borfle\nbib.gif\nno 0: borfle /.*$/s borfle\nbib.gif\nno 0: borfle\x0abib.gif\x0ano /.*$/ms borfle\nbib.gif\nno 0: borfle\x0abib.gif\x0ano /.*$/ borfle\nbib.gif\nno\n 0: no /.*$/m borfle\nbib.gif\nno\n 0: borfle /.*$/s borfle\nbib.gif\nno\n 0: borfle\x0abib.gif\x0ano\x0a /.*$/ms borfle\nbib.gif\nno\n 0: borfle\x0abib.gif\x0ano\x0a /(.*X|^B)/ abcde\n1234Xyz 0: 1234X 1: 1234X BarFoo 0: B 1: B *** Failers No match: POSIX code 17: match failed abcde\nBar No match: POSIX code 17: match failed /(.*X|^B)/m abcde\n1234Xyz 0: 1234X 1: 1234X BarFoo 0: B 1: B abcde\nBar 0: B 1: B /(.*X|^B)/s abcde\n1234Xyz 0: abcde\x0a1234X 1: abcde\x0a1234X BarFoo 0: B 1: B *** Failers No match: POSIX code 17: match failed abcde\nBar No match: POSIX code 17: match failed /(.*X|^B)/ms abcde\n1234Xyz 0: abcde\x0a1234X 1: abcde\x0a1234X BarFoo 0: B 1: B abcde\nBar 0: B 1: B /(?s)(.*X|^B)/ abcde\n1234Xyz 0: abcde\x0a1234X 1: abcde\x0a1234X BarFoo 0: B 1: B *** Failers No match: POSIX code 17: match failed abcde\nBar No match: POSIX code 17: match failed /(?s:.*X|^B)/ abcde\n1234Xyz 0: abcde\x0a1234X BarFoo 0: B *** Failers No match: POSIX code 17: match failed abcde\nBar No match: POSIX code 17: match failed /^.*B/ **** Failers No match: POSIX code 17: match failed abc\nB No match: POSIX code 17: match failed /(?s)^.*B/ abc\nB 0: abc\x0aB /(?m)^.*B/ abc\nB 0: B /(?ms)^.*B/ abc\nB 0: abc\x0aB /(?ms)^B/ abc\nB 0: B /(?s)B$/ B\n 0: B /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ 123456654321 0: 123456654321 /^\d\d\d\d\d\d\d\d\d\d\d\d/ 123456654321 0: 123456654321 /^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ 123456654321 0: 123456654321 /^[abc]{12}/ abcabcabcabc 0: abcabcabcabc /^[a-c]{12}/ abcabcabcabc 0: abcabcabcabc /^(a|b|c){12}/ abcabcabcabc 0: abcabcabcabc 1: c /^[abcdefghijklmnopqrstuvwxy0123456789]/ n 0: n *** Failers No match: POSIX code 17: match failed z No match: POSIX code 17: match failed /abcde{0,0}/ abcd 0: abcd *** Failers No match: POSIX code 17: match failed abce No match: POSIX code 17: match failed /ab[cd]{0,0}e/ abe 0: abe *** Failers No match: POSIX code 17: match failed abcde No match: POSIX code 17: match failed /ab(c){0,0}d/ abd 0: abd *** Failers No match: POSIX code 17: match failed abcd No match: POSIX code 17: match failed /a(b*)/ a 0: a 1: ab 0: ab 1: b abbbb 0: abbbb 1: bbbb *** Failers 0: a 1: bbbbb No match: POSIX code 17: match failed /ab\d{0}e/ abe 0: abe *** Failers No match: POSIX code 17: match failed ab1e No match: POSIX code 17: match failed /"([^\\"]+|\\.)*"/ the \"quick\" brown fox 0: "quick" 1: quick \"the \\\"quick\\\" brown fox\" 0: "the \"quick\" brown fox" 1: brown fox /.*?/g+ abc 0: 0+ abc /\b/g+ abc 0: 0+ abc /\b/+g abc 0: 0+ abc //g abc 0: /]{0,})>]{0,})>([\d]{0,}\.)(.*)((
    ([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is 43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide 0: 43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide 1: BGCOLOR='#DBE9E9' 2: align=left valign=top 3: 43. 4: Word Processor
    (N-1286) 5: 6: 8: align=left valign=top 9: Lega lstaff.com 10: align=left valign=top 11: CA - Statewide /a[^a]b/ acb 0: acb a\nb 0: a\x0ab /a.b/ acb 0: acb *** Failers No match: POSIX code 17: match failed a\nb No match: POSIX code 17: match failed /a[^a]b/s acb 0: acb a\nb 0: a\x0ab /a.b/s acb 0: acb a\nb 0: a\x0ab /^(b+?|a){1,2}?c/ bac 0: bac 1: a bbac 0: bbac 1: a bbbac 0: bbbac 1: a bbbbac 0: bbbbac 1: a bbbbbac 0: bbbbbac 1: a /^(b+|a){1,2}?c/ bac 0: bac 1: a bbac 0: bbac 1: a bbbac 0: bbbac 1: a bbbbac 0: bbbbac 1: a bbbbbac 0: bbbbbac 1: a /(?!\A)x/m a\bx\n 0: x *** Failers No match: POSIX code 17: match failed x\nb\n No match: POSIX code 17: match failed /\x0{ab}/ \0{ab} 0: \x00{ab} /(A|B)*?CD/ CD 0: CD /(A|B)*CD/ CD 0: CD /(AB)*?\1/ ABABAB 0: ABAB 1: AB /(AB)*\1/ ABABAB 0: ABABAB 1: AB / End of testinput1 / sed-3.62/testsuite/pcre2.good0000644000076600007660000006025410202632275013100 00000000000000/the quick brown fox/ the quick brown fox 0: the quick brown fox What do you know about the quick brown fox? 0: the quick brown fox *** Failers No match The quick brown FOX No match What do you know about THE QUICK BROWN FOX? No match /The quick brown fox/i the quick brown fox 0: the quick brown fox The quick brown FOX 0: The quick brown FOX What do you know about the quick brown fox? 0: the quick brown fox What do you know about THE QUICK BROWN FOX? 0: THE QUICK BROWN FOX /abcd\t\n\r\f\a\e\o071\x3b\$\\?caxyz/ abcd\t\n\r\f\a\e9;\$\\?caxyz 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/x abxyzpqrrrabbxyyyypqAzz 0: abxyzpqrrrabbxyyyypqAzz abxyzpqrrrabbxyyyypqAzz 0: abxyzpqrrrabbxyyyypqAzz aabxyzpqrrrabbxyyyypqAzz 0: aabxyzpqrrrabbxyyyypqAzz aaabxyzpqrrrabbxyyyypqAzz 0: aaabxyzpqrrrabbxyyyypqAzz aaaabxyzpqrrrabbxyyyypqAzz 0: aaaabxyzpqrrrabbxyyyypqAzz abcxyzpqrrrabbxyyyypqAzz 0: abcxyzpqrrrabbxyyyypqAzz aabcxyzpqrrrabbxyyyypqAzz 0: aabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypAzz 0: aaabcxyzpqrrrabbxyyyypAzz aaabcxyzpqrrrabbxyyyypqAzz 0: aaabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypqqAzz 0: aaabcxyzpqrrrabbxyyyypqqAzz aaabcxyzpqrrrabbxyyyypqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqAzz aaabcxyzpqrrrabbxyyyypqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz aaaabcxyzpqrrrabbxyyyypqAzz 0: aaaabcxyzpqrrrabbxyyyypqAzz abxyzzpqrrrabbxyyyypqAzz 0: abxyzzpqrrrabbxyyyypqAzz aabxyzzzpqrrrabbxyyyypqAzz 0: aabxyzzzpqrrrabbxyyyypqAzz aaabxyzzzzpqrrrabbxyyyypqAzz 0: aaabxyzzzzpqrrrabbxyyyypqAzz aaaabxyzzzzpqrrrabbxyyyypqAzz 0: aaaabxyzzzzpqrrrabbxyyyypqAzz abcxyzzpqrrrabbxyyyypqAzz 0: abcxyzzpqrrrabbxyyyypqAzz aabcxyzzzpqrrrabbxyyyypqAzz 0: aabcxyzzzpqrrrabbxyyyypqAzz aaabcxyzzzzpqrrrabbxyyyypqAzz 0: aaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbxyyyypqAzz 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyypqAzz 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyypqAzz 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz aaabcxyzpqrrrabbxyyyypABzz 0: aaabcxyzpqrrrabbxyyyypABzz aaabcxyzpqrrrabbxyyyypABBzz 0: aaabcxyzpqrrrabbxyyyypABBzz >>>aaabxyzpqrrrabbxyyyypqAzz 0: aaabxyzpqrrrabbxyyyypqAzz >aaaabxyzpqrrrabbxyyyypqAzz 0: aaaabxyzpqrrrabbxyyyypqAzz >>>>abcxyzpqrrrabbxyyyypqAzz 0: abcxyzpqrrrabbxyyyypqAzz *** Failers No match abxyzpqrrabbxyyyypqAzz No match abxyzpqrrrrabbxyyyypqAzz No match abxyzpqrrrabxyyyypqAzz No match aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz No match aaaabcxyzzzzpqrrrabbbxyyypqAzz No match aaabcxyzpqrrrabbxyyyypqqqqqqqAzz No match /^\(abc\)\{1,2\}zz/ abczz 0: abczz 1: abc abcabczz 0: abcabczz 1: abc *** Failers No match zz No match abcabcabczz No match >>abczz No match /^(b+|a){1,2}c/x bc 0: bc 1: b bbc 0: bbc 1: bb bbbc 0: bbbc 1: bbb bac 0: bac 1: a bbac 0: bbac 1: a aac 0: aac 1: a abbbbbbbbbbbc 0: abbbbbbbbbbbc 1: bbbbbbbbbbb bbbbbbbbbbbac 0: bbbbbbbbbbbac 1: a *** Failers No match aaac No match abbbbbbbbbbbac No match /^\(b\+\|a\)\{1,2\}c/ bc 0: bc 1: b bbc 0: bbc 1: bb bbbc 0: bbbc 1: bbb bac 0: bac 1: a bbac 0: bbac 1: a aac 0: aac 1: a abbbbbbbbbbbc 0: abbbbbbbbbbbc 1: bbbbbbbbbbb bbbbbbbbbbbac 0: bbbbbbbbbbbac 1: a *** Failers No match aaac No match abbbbbbbbbbbac No match /^(b+|a){1,2}?bc/x bbc 0: bbc 1: b /^ba*\(ba\)\?bc/ babc 0: babc bbabc 0: bbabc 1: ba bababc 0: bababc 1: ba *** Failers No match bababbc No match babababc No match # Under Perl rules, babc matches as this: # first repetition of (ba|b*) sets subexpression 1 to ba # second repetition of (ba|b*) sets subexpression 1 to the empty string # then bc matches # # Under Posix rules, however, "a subexpression repeated by an # asterisk ('*') _or an interval expression_ shall not match a # null expression unless this is the only match for the # repetition or it is necessary to satisfy the exact or # minimum number of occurrences for the interval expression." # This goes against the general rule for greedy matching, anyway # it matches as this: # first repetition of (ba|b*) sets subexpression 1 to ba # second repetition of (ba|b*) is void and ignored # bc matches /^(ba|b*){1,2}bc/x babc 0: babc 1: b bbabc 0: bbabc 1: ba babbbc 0: babbbc 1: bb *** Failers No match bababbc No match babababc No match /^\ca\cA\c[\c{\c:/x \x01\x01\e;z 0: \x01\x01\x1b;z /^[]cde]/ ]thing 0: ] cthing 0: c dthing 0: d ething 0: e *** Failers No match athing No match fthing No match /^[^]cde]/ athing 0: a fthing 0: f *** Failers 0: * ]thing No match cthing No match dthing No match ething No match /^\/ 0: \x81 /^ÿ/ ÿ 0: \xff /^[0-9]+$/x 0 0: 0 1 0: 1 2 0: 2 3 0: 3 4 0: 4 5 0: 5 6 0: 6 7 0: 7 8 0: 8 9 0: 9 10 0: 10 100 0: 100 *** Failers No match abc No match /^.*nter/x enter 0: enter inter 0: inter uponter 0: uponter /b*c*b+/x bbbb 0: bbbb /^xxx[0-9]+$/x xxx0 0: xxx0 xxx1234 0: xxx1234 *** Failers No match xxx No match /^.+[0-9][0-9][0-9]$/x x123 0: x123 xx123 0: xx123 123456 0: 123456 *** Failers No match 123 No match x1234 0: x1234 /^.+[0-9][0-9][0-9]$/x x123 0: x123 xx123 0: xx123 123456 0: 123456 *** Failers No match 123 No match x1234 0: x1234 /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/x abc!pqr=apquxz.ixr.zzz.ac.uk 0: abc!pqr=apquxz.ixr.zzz.ac.uk 1: abc 2: pqr *** Failers No match !pqr=apquxz.ixr.zzz.ac.uk No match abc!=apquxz.ixr.zzz.ac.uk No match abc!pqr=apquxz:ixr.zzz.ac.uk No match abc!pqr=apquxz.ixr.zzz.ac.ukk No match /:/ Well, we need a colon: somewhere 0: : *** Failers No match Fail if we don't No match /([0-9a-f:]+)$/xi 0abc 0: 0abc 1: 0abc abc 0: abc 1: abc fed 0: fed 1: fed E 0: E 1: E :: 0: :: 1: :: 5f03:12C0::932e 0: 5f03:12C0::932e 1: 5f03:12C0::932e fed def 0: def 1: def Any old stuff 0: ff 1: ff *** Failers No match 0zzz No match gzzz No match fed\x20 No match Any old rubbish No match /^.*\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/x .1.2.3 0: .1.2.3 1: 1 2: 2 3: 3 A.12.123.0 0: A.12.123.0 1: 12 2: 123 3: 0 *** Failers No match .1.2.3333 No match 1.2.3 No match 1234.2.3 No match /^([0-9]+)[ \t]+IN[ \t]+SOA[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]*\([ \t]*$/x 1 IN SOA non-sp1 non-sp2( 0: 1 IN SOA non-sp1 non-sp2( 1: 1 2: non-sp1 3: non-sp2 1 IN SOA non-sp1 non-sp2 ( 0: 1 IN SOA non-sp1 non-sp2 ( 1: 1 2: non-sp1 3: non-sp2 *** Failers No match 1IN SOA non-sp1 non-sp2( No match /^[a-zA-Z0-9][a-zA-Z0-9\-]*(\.[a-zA-Z0-9][a-zA-z0-9\-]*)*\.$/x a. 0: a. Z. 0: Z. 2. 0: 2. ab-c.pq-r. 0: ab-c.pq-r. 1: .pq-r sxk.zzz.ac.uk. 0: sxk.zzz.ac.uk. 1: .uk x-.y-. 0: x-.y-. 1: .y- *** Failers No match -abc.peq. No match /^[0-9a-f](\.[0-9a-f])*$/xi a.b.c.d 0: a.b.c.d 1: .d A.B.C.D 0: A.B.C.D 1: .D a.b.c.1.2.3.C 0: a.b.c.1.2.3.C 1: .C /^\".*\"[ \t]*(;.*)?$/x \"1234\" 0: "1234" \"abcd\" ; 0: "abcd" ; 1: ; \"\" ; rhubarb 0: "" ; rhubarb 1: ; rhubarb *** Failers No match \"1234\" : things No match /^$/ \ 0: *** Failers No match /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/x abcdefhijklm 0: abcdefhijklm 1: abc 2: bc 3: c 4: def 5: ef 6: f 7: hij 8: ij 9: j 10: klm 11: lm 12: m /^[A-Za-z_][^A-Za-z_][ \t][^ \t][0-9][^0-9]\x08[\n][\c]][\o022]/x a+ Z0+\x08\n\x1d\x12 0: a+ Z0+\x08\x0a\x1d\x12 /^[.^\\$|()*+?{,}]\+/ .^\$(*+)|{?,?} 0: .^$(*+)|{?,?} /^a*\w/x z 0: z az 0: az aaaz 0: aaaz a 0: a aa 0: aa aaaa 0: aaaa a+ 0: a aa+ 0: aa /^a*\w/ z 0: z az 0: az aaaz 0: aaaz a 0: a aa 0: aa aaaa 0: aaaa a+ 0: a aa+ 0: aa /^a+\w/x az 0: az aaaz 0: aaaz aa 0: aa aaaa 0: aaaa aa+ 0: aa /^a\+\w/ az 0: az aaaz 0: aaaz aa 0: aa aaaa 0: aaaa aa+ 0: aa /^[0-9]{8}\w{2,}/x 1234567890 0: 1234567890 12345678ab 0: 12345678ab 12345678__ 0: 12345678__ *** Failers No match 1234567 No match /^[aeiou0-9]{4,5}$/x uoie 0: uoie 1234 0: 1234 12345 0: 12345 aaaaa 0: aaaaa *** Failers No match 123456 No match /^[aeiou0-9]{4,5}/x uoie 0: uoie 1234 0: 1234 12345 0: 12345 aaaaa 0: aaaaa 123456 0: 12345 /\`(abc|def)=(\1){2,3}\'/x abc=abcabc 0: abc=abcabc 1: abc 2: abc def=defdefdef 0: def=defdefdef 1: def 2: def *** Failers No match abc=defdef No match /(cat(a(ract|tonic)|erpillar)) \1()2(3)/x cataract cataract23 0: cataract cataract23 1: cataract 2: aract 3: ract 4: 5: 3 catatonic catatonic23 0: catatonic catatonic23 1: catatonic 2: atonic 3: tonic 4: 5: 3 caterpillar caterpillar23 0: caterpillar caterpillar23 1: caterpillar 2: erpillar 3: 4: 5: 3 /^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/x From abcd Mon Sep 01 12:33:02 1997 0: From abcd Mon Sep 01 12:33 1: abcd /^From[ \t]+[^ \t]+[ \t]+([a-zA-Z]{3}[ \t]+){2}[0-9]{1,2}[ \t]+[0-9][0-9]:[0-9][0-9]/x From abcd Mon Sep 01 12:33:02 1997 0: From abcd Mon Sep 01 12:33 1: Sep From abcd Mon Sep 1 12:33:02 1997 0: From abcd Mon Sep 1 12:33 1: Sep *** Failers No match From abcd Sep 01 12:33:02 1997 No match /^12.34/xs 12\n34 0: 12\x0a34 12\r34 0: 12\x0d34 /^(a)\1{2,3}(.)/x aaab 0: aaab 1: a 2: b aaaab 0: aaaab 1: a 2: b aaaaab 0: aaaaa 1: a 2: a aaaaaab 0: aaaaa 1: a 2: a /^[ab]{1,3}(ab*|b)/x aabbbbb 0: aabb 1: b /^[ab]{1,3}(ab*|b)/x aabbbbb 0: aabb 1: b /^[ab]{1,3}(ab*|b)/x aabbbbb 0: aabb 1: b /^[ab]{1,3}(ab*|b)/x aabbbbb 0: aabb 1: b /abc\o0def\o00pqr\o000xyz\o0000AB/x abc\0def\00pqr\000xyz\0000AB 0: abc\x00def\x00pqr\x00xyz\x000AB abc456 abc\0def\00pqr\000xyz\0000ABCDE 0: abc\x00def\x00pqr\x00xyz\x000AB /abc\x0def\x00pqr\x000xyz\x0000AB/x abc\x0def\x00pqr\x000xyz\x0000AB 0: abc\x0def\x00pqr\x000xyz\x0000AB abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE 0: abc\x0def\x00pqr\x000xyz\x0000AB /^[\o000-\o037]/ \0A 0: \x00 \01B 0: \x01 \037C 0: \x1f /\o0*/ \0\0\0\0 0: \x00\x00\x00\x00 /A\x0{2,3}Z/x The A\x0\x0Z 0: A\x00\x00Z An A\0\x0\0Z 0: A\x00\x00\x00Z *** Failers No match A\0Z No match A\0\x0\0\x0Z No match /^(cow|)\1(bell)/x cowcowbell 0: cowcowbell 1: cow 2: bell bell 0: bell 1: 2: bell *** Failers No match cowbell No match /^[ \t\n\r\f]/ \040abc 0: \x0cabc 0: \x0c \nabc 0: \x0a \rabc 0: \x0d \tabc 0: \x09 *** Failers No match abc No match /^(a|)\1*b/x ab 0: ab 1: a aaaab 0: aaaab 1: a b 0: b 1: *** Failers No match acb No match /^(a|)\1+b/x aab 0: aab 1: a aaaab 0: aaaab 1: a b 0: b 1: *** Failers No match ab No match /^(a|)\1?b/x ab 0: ab 1: a aab 0: aab 1: a b 0: b 1: *** Failers No match acb No match /^(a|)\1{2}b/x aaab 0: aaab 1: a b 0: b 1: *** Failers No match ab No match aab No match aaaab No match /^(a|)\1{2,3}b/x aaab 0: aaab 1: a aaaab 0: aaaab 1: a b 0: b 1: *** Failers No match ab No match aab No match aaaaab No match /ab{1,3}bc/x abbbbc 0: abbbbc abbbc 0: abbbc abbc 0: abbc *** Failers No match abc No match abbbbbc No match /([^.]*)\.([^:]*):[T ]+(.*)/x track1.title:TBlah blah blah 0: track1.title:TBlah blah blah 1: track1 2: title 3: Blah blah blah /([^.]*)\.([^:]*):[T ]+(.*)/xi track1.title:TBlah blah blah 0: track1.title:TBlah blah blah 1: track1 2: title 3: Blah blah blah /([^.]*)\.([^:]*):[t ]+(.*)/xi track1.title:TBlah blah blah 0: track1.title:TBlah blah blah 1: track1 2: title 3: Blah blah blah /^[W-c]+$/x WXY_^abc 0: WXY_^abc ***Failers No match wxy No match /^[W-c]+$/xi WXY_^abc 0: WXY_^abc wxy_^ABC 0: wxy_^ABC /^[\x3f-\x5F]+$/xi WXY_^abc 0: WXY_^abc wxy_^ABC 0: wxy_^ABC /^abc$/ abc 0: abc *** Failers No match qqq\nabc No match abc\nzzz No match qqq\nabc\nzzz No match /\`(.)*\'/xs abc\ndef 0: abc\x0adef 1: f /[-az]+/x az- 0: az- *** Failers 0: a b No match /[az-]+/x za- 0: za- *** Failers 0: a b No match /[az-]+/x a-z 0: a-z *** Failers 0: a b No match /[a-z]+/x abcdxyz 0: abcdxyz /[0-9-]+/x 12-34 0: 12-34 *** Failers No match aaa No match /[0-9-z]+/x 12-34z 0: 12-34z *** Failers No match aaa No match /\x5c/ \\ 0: \ /\x20Z/ the Zoo 0: Z *** Failers No match Zulu No match /(abc)\1/xi abcabc 0: abcabc 1: abc ABCabc 0: ABCabc 1: ABC abcABC 0: abcABC 1: abc /ab{3cd/ ab{3cd 0: ab{3cd /ab{3,cd/ ab{3,cd 0: ab{3,cd /ab{3,4a}cd/ ab{3,4a}cd 0: ab{3,4a}cd /{4,5a}bc/x {4,5a}bc 0: {4,5a}bc /^a.b/ a\rb 0: a\x0db *** Failers No match a\nb No match /abc$/ abc 0: abc *** Failers No match abc\n No match abc\ndef No match /(abc)\o123/x abc\x53 0: abcS 1: abc /(abc)\o223/x abc\x93 0: abc\x93 1: abc /(abc)\o323/x abc\xd3 0: abc\xd3 1: abc /(abc)\500/x Failed: back reference to non-existent subpattern at offset 9 /(abc)\5000/x Failed: back reference to non-existent subpattern at offset 10 /abc\81/ Failed: back reference to non-existent subpattern at offset 6 /abc\91/ Failed: back reference to non-existent subpattern at offset 6 /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12/x abcdefghijkla2 0: abcdefghijkla2 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k 12: l /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\123/x abcdefghijka23 0: abcdefghijka23 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k /ab\gdef/x abgdef 0: abgdef /a{0}bc/x bc 0: bc /(a|(bc)){0,0}xyz/x xyz 0: xyz /abc[\o10]de/x abc\010de 0: abc\x08de /abc[\o1]de/x abc\1de 0: abc\x01de /(abc)[\o1]de/x abc\1de 0: abc\x01de 1: abc /^([^a])([^\b])([^c]*)([^d]{3,4})/x baNOTccccd 0: baNOTcccc 1: b 2: a 3: NOT 4: cccc baNOTcccd 0: baNOTccc 1: b 2: a 3: NOT 4: ccc baNOTccd 0: baNOTcc 1: b 2: a 3: NO 4: Tcc bacccd 0: baccc 1: b 2: a 3: 4: ccc *** Failers 0: *** Failers 1: * 2: * 3: * Fail 4: ers anything No match b\bc No match baccd No match /[^a]/ Abc 0: A /[^a]/i Abc 0: b /[^a]+/x AAAaAbc 0: AAA /[^a]+/xi AAAaAbc 0: bc /[^a]+/x bbb\nccc 0: bbb\x0accc /[^k]$/x abc 0: c *** Failers 0: s abk No match /[^k]{2,3}$/x abc 0: abc kbc 0: bc kabc 0: abc *** Failers 0: ers abk No match akb No match akk No match /^[0-9]{8,}\@.+[^k]$/x 12345678\@a.b.c.d 0: 12345678@a.b.c.d 123456789\@x.y.z 0: 123456789@x.y.z *** Failers No match 12345678\@x.y.uk No match 1234567\@a.b.c.d No match /(a)\1{8,}/x aaaaaaaaa 0: aaaaaaaaa 1: a aaaaaaaaaa 0: aaaaaaaaaa 1: a *** Failers No match aaaaaaa No match /[^a]/x aaaabcd 0: b aaAabcd 0: A /[^a]/i aaaabcd 0: b aaAabcd 0: b /[^az]/x aaaabcd 0: b aaAabcd 0: A /[^az]/i aaaabcd 0: b aaAabcd 0: b /\o000\o001\o002\o003\o004\o005\o006\o007\o010\o011\o012\o013\o014\o015\o016\o017\o020\o021\o022\o023\o024\o025\o026\o027\o030\o031\o032\o033\o034\o035\o036\o037\o040\o041\o042\o043\o044\o045\o046\o047\o050\o051\o052\o053\o054\o055\o056\o057\o060\o061\o062\o063\o064\o065\o066\o067\o070\o071\o072\o073\o074\o075\o076\o077\o100\o101\o102\o103\o104\o105\o106\o107\o110\o111\o112\o113\o114\o115\o116\o117\o120\o121\o122\o123\o124\o125\o126\o127\o130\o131\o132\o133\o134\o135\o136\o137\o140\o141\o142\o143\o144\o145\o146\o147\o150\o151\o152\o153\o154\o155\o156\o157\o160\o161\o162\o163\o164\o165\o166\o167\o170\o171\o172\o173\o174\o175\o176\o177\o200\o201\o202\o203\o204\o205\o206\o207\o210\o211\o212\o213\o214\o215\o216\o217\o220\o221\o222\o223\o224\o225\o226\o227\o230\o231\o232\o233\o234\o235\o236\o237\o240\o241\o242\o243\o244\o245\o246\o247\o250\o251\o252\o253\o254\o255\o256\o257\o260\o261\o262\o263\o264\o265\o266\o267\o270\o271\o272\o273\o274\o275\o276\o277\o300\o301\o302\o303\o304\o305\o306\o307\o310\o311\o312\o313\o314\o315\o316\o317\o320\o321\o322\o323\o324\o325\o326\o327\o330\o331\o332\o333\o334\o335\o336\o337\o340\o341\o342\o343\o344\o345\o346\o347\o350\o351\o352\o353\o354\o355\o356\o357\o360\o361\o362\o363\o364\o365\o366\o367\o370\o371\o372\o373\o374\o375\o376\o377/ \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377 0: \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff /P[^*]TAIRE[^*]{1,6}LL/x xxxxxxxxxxxPSTAIREISLLxxxxxxxxx 0: PSTAIREISLL /P[^*]TAIRE[^*]{1,}LL/x xxxxxxxxxxxPSTAIREISLLxxxxxxxxx 0: PSTAIREISLL /(\.[0-9][0-9][1-9]?)[0-9]+/x 1.230003938 0: .230003938 1: .23 1.875000282 0: .875000282 1: .875 1.235 0: .235 1: .23 /\b(foo)[ \t]+(\w+)/xi Food is on the foo table 0: foo table 1: foo 2: table /foo(.*)bar/x The food is under the bar in the barn. 0: food is under the bar in the bar 1: d is under the bar in the /foo(.*)bar/x The food is under the bar in the barn. 0: food is under the bar in the bar 1: d is under the bar in the /(.*)([0-9]*)/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 53147 2: /(.*)([0-9]+)/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*)([0-9]*)/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 53147 2: /(.*)([0-9]+)/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*)([0-9]+)$/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*)([0-9]+)$/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*)\b([0-9]+)$/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /(.*[^0-9])([0-9]+)$/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /^[W-]46]/x W46]789 0: W46] -46]789 0: -46] *** Failers No match Wall No match Zebra No match 42 No match [abcd] No match ]abcd[ No match /^[W-\46]/x W46]789 0: W Wall 0: W Zebra 0: Z Xylophone 0: X 42 0: 4 [abcd] 0: [ \\backslash 0: \ *** Failers No match -46]789 No match well No match /[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]/x 01/01/2000 0: 01/01/2000 /^(a){0,0}/x bcd 0: abc 0: aab 0: /^(a){0,1}/x bcd 0: abc 0: a 1: a aab 0: a 1: a /^(a){0,2}/x bcd 0: abc 0: a 1: a aab 0: aa 1: a /^(a){0,3}/x bcd 0: abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a /^(a){0,}/x bcd 0: abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a aaaaaaaa 0: aaaaaaaa 1: a /^(a){1,1}/x abc 0: a 1: a aab 0: a 1: a *** Failers: No match bcd No match /^(a){1,2}/x abc 0: a 1: a aab 0: aa 1: a *** Failers: No match bcd No match /^(a){1,3}/x abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a *** Failers: No match bcd No match /^(a){1,}/x abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a aaaaaaaa 0: aaaaaaaa 1: a *** Failers: No match bcd No match /.*\.gif/x borfle\nbib.gif\nno 0: bib.gif /.{0,}\.gif/x borfle\nbib.gif\nno 0: bib.gif /^.*\.gif/xs borfle\nbib.gif\nno 0: borfle\x0abib.gif /.*$/ borfle\nbib.gif\nno 0: no /.*$/ *** Failers 0: *** Failers borfle\nbib.gif\nno\n 0: /(.*X|^B)/x abcde\n1234Xyz 0: 1234X 1: 1234X BarFoo 0: B 1: B *** Failers No match abcde\nBar No match /^.*B/x **** Failers No match abc\nB No match /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/x 123456654321 0: 123456654321 /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ 123456654321 0: 123456654321 /^[abc]{12}/x abcabcabcabc 0: abcabcabcabc /^[a-c]{12}/x abcabcabcabc 0: abcabcabcabc /^(a|b|c){12}/x abcabcabcabc 0: abcabcabcabc 1: c /^[abcdefghijklmnopqrstuvwxy0123456789]/x n 0: n *** Failers No match z No match /abcde{0,0}/x abcd 0: abcd *** Failers No match abce No match /ab[cd]{0,0}e/x abe 0: abe *** Failers No match abcde No match /ab(c){0,0}d/x abd 0: abd *** Failers No match abcd No match /a(b*)/x a 0: a 1: ab 0: ab 1: b abbbb 0: abbbb 1: bbbb *** Failers 0: a 1: bbbbb No match /ab[0-9]{0}e/x abe 0: abe *** Failers No match ab1e No match /"([^\\"]+|\\.)*"/x the \"quick\" brown fox 0: "quick" 1: quick \"the \\\"quick\\\" brown fox\" 0: "the \"quick\" brown fox" 1: brown fox /.*/g+ abc 0: abc 0+ 0: 0+ /\b/g+ abc 0: 0+ abc 0: 0+ /\b/+g abc 0: 0+ abc 0: 0+ //g abc 0: 0: 0: 0: /a[^a]b/x acb 0: acb a\nb 0: a\x0ab /a.b/ acb 0: acb *** Failers No match a\nb No match /^(b+|a){1,2}c/x bac 0: bac 1: a bbac 0: bbac 1: a bbbac 0: bbbac 1: a bbbbac 0: bbbbac 1: a bbbbbac 0: bbbbbac 1: a /^(b+|a){1,2}c/x bac 0: bac 1: a bbac 0: bbac 1: a bbbac 0: bbbac 1: a bbbbac 0: bbbbac 1: a bbbbbac 0: bbbbbac 1: a /\x0{ab}/ \0{ab} 0: \x00{ab} /(A|B)*CD/x CD 0: CD /(A|B)*CD/x CD 0: CD /(AB)*\1/x ABABAB 0: ABABAB 1: AB /(AB)*\1/x ABABAB 0: ABABAB 1: AB /[[.z.]]/ bbbccczzz 0: z bbbcccz 0: z *** Failers No match bbbccc No match /[[.z.]]+z/x bbbccczzz 0: zzz *** Failers No match bbbcccz No match bbbccc No match /[[=z=]]/ bbbccczzz 0: z bbbcccz 0: z *** Failers No match bbbccc No match /[[=z=]]+z/x bbbccczzz 0: zzz *** Failers No match bbbcccz No match bbbccc No match / End of testinput1 / sed-3.62/testsuite/pcre2.inp0000644000076600007660000003544610202632172012737 00000000000000/the quick brown fox/ the quick brown fox What do you know about the quick brown fox? *** Failers The quick brown FOX What do you know about THE QUICK BROWN FOX? /The quick brown fox/i the quick brown fox The quick brown FOX What do you know about the quick brown fox? What do you know about THE QUICK BROWN FOX? /abcd\t\n\r\f\a\e\o071\x3b\$\\?caxyz/ abcd\t\n\r\f\a\e9;\$\\?caxyz /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/x abxyzpqrrrabbxyyyypqAzz abxyzpqrrrabbxyyyypqAzz aabxyzpqrrrabbxyyyypqAzz aaabxyzpqrrrabbxyyyypqAzz aaaabxyzpqrrrabbxyyyypqAzz abcxyzpqrrrabbxyyyypqAzz aabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypAzz aaabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypqqAzz aaabcxyzpqrrrabbxyyyypqqqAzz aaabcxyzpqrrrabbxyyyypqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqqAzz aaaabcxyzpqrrrabbxyyyypqAzz abxyzzpqrrrabbxyyyypqAzz aabxyzzzpqrrrabbxyyyypqAzz aaabxyzzzzpqrrrabbxyyyypqAzz aaaabxyzzzzpqrrrabbxyyyypqAzz abcxyzzpqrrrabbxyyyypqAzz aabcxyzzzpqrrrabbxyyyypqAzz aaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyypqAzz aaabcxyzpqrrrabbxyyyypABzz aaabcxyzpqrrrabbxyyyypABBzz >>>aaabxyzpqrrrabbxyyyypqAzz >aaaabxyzpqrrrabbxyyyypqAzz >>>>abcxyzpqrrrabbxyyyypqAzz *** Failers abxyzpqrrabbxyyyypqAzz abxyzpqrrrrabbxyyyypqAzz abxyzpqrrrabxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyypqAzz aaabcxyzpqrrrabbxyyyypqqqqqqqAzz /^\(abc\)\{1,2\}zz/ abczz abcabczz *** Failers zz abcabcabczz >>abczz /^(b+|a){1,2}c/x bc bbc bbbc bac bbac aac abbbbbbbbbbbc bbbbbbbbbbbac *** Failers aaac abbbbbbbbbbbac /^\(b\+\|a\)\{1,2\}c/ bc bbc bbbc bac bbac aac abbbbbbbbbbbc bbbbbbbbbbbac *** Failers aaac abbbbbbbbbbbac /^(b+|a){1,2}?bc/x bbc /^ba*\(ba\)\?bc/ babc bbabc bababc *** Failers bababbc babababc # Under Perl rules, babc matches as this: # first repetition of (ba|b*) sets subexpression 1 to ba # second repetition of (ba|b*) sets subexpression 1 to the empty string # then bc matches # # Under Posix rules, however, "a subexpression repeated by an # asterisk ('*') _or an interval expression_ shall not match a # null expression unless this is the only match for the # repetition or it is necessary to satisfy the exact or # minimum number of occurrences for the interval expression." # This goes against the general rule for greedy matching, anyway # it matches as this: # first repetition of (ba|b*) sets subexpression 1 to ba # second repetition of (ba|b*) is void and ignored # bc matches /^(ba|b*){1,2}bc/x babc bbabc babbbc *** Failers bababbc babababc /^\ca\cA\c[\c{\c:/x \x01\x01\e;z /^[]cde]/ ]thing cthing dthing ething *** Failers athing fthing /^[^]cde]/ athing fthing *** Failers ]thing cthing dthing ething /^\/ /^ÿ/ ÿ /^[0-9]+$/x 0 1 2 3 4 5 6 7 8 9 10 100 *** Failers abc /^.*nter/x enter inter uponter /b*c*b+/x bbbb /^xxx[0-9]+$/x xxx0 xxx1234 *** Failers xxx /^.+[0-9][0-9][0-9]$/x x123 xx123 123456 *** Failers 123 x1234 /^.+[0-9][0-9][0-9]$/x x123 xx123 123456 *** Failers 123 x1234 /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/x abc!pqr=apquxz.ixr.zzz.ac.uk *** Failers !pqr=apquxz.ixr.zzz.ac.uk abc!=apquxz.ixr.zzz.ac.uk abc!pqr=apquxz:ixr.zzz.ac.uk abc!pqr=apquxz.ixr.zzz.ac.ukk /:/ Well, we need a colon: somewhere *** Failers Fail if we don't /([0-9a-f:]+)$/xi 0abc abc fed E :: 5f03:12C0::932e fed def Any old stuff *** Failers 0zzz gzzz fed\x20 Any old rubbish /^.*\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/x .1.2.3 A.12.123.0 *** Failers .1.2.3333 1.2.3 1234.2.3 /^([0-9]+)[ \t]+IN[ \t]+SOA[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]*\([ \t]*$/x 1 IN SOA non-sp1 non-sp2( 1 IN SOA non-sp1 non-sp2 ( *** Failers 1IN SOA non-sp1 non-sp2( /^[a-zA-Z0-9][a-zA-Z0-9\-]*(\.[a-zA-Z0-9][a-zA-z0-9\-]*)*\.$/x a. Z. 2. ab-c.pq-r. sxk.zzz.ac.uk. x-.y-. *** Failers -abc.peq. /^[0-9a-f](\.[0-9a-f])*$/xi a.b.c.d A.B.C.D a.b.c.1.2.3.C /^\".*\"[ \t]*(;.*)?$/x \"1234\" \"abcd\" ; \"\" ; rhubarb *** Failers \"1234\" : things /^$/ \ *** Failers /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/x abcdefhijklm /^[A-Za-z_][^A-Za-z_][ \t][^ \t][0-9][^0-9]\x08[\n][\c]][\o022]/x a+ Z0+\x08\n\x1d\x12 /^[.^\\$|()*+?{,}]\+/ .^\$(*+)|{?,?} /^a*\w/x z az aaaz a aa aaaa a+ aa+ /^a*\w/ z az aaaz a aa aaaa a+ aa+ /^a+\w/x az aaaz aa aaaa aa+ /^a\+\w/ az aaaz aa aaaa aa+ /^[0-9]{8}\w{2,}/x 1234567890 12345678ab 12345678__ *** Failers 1234567 /^[aeiou0-9]{4,5}$/x uoie 1234 12345 aaaaa *** Failers 123456 /^[aeiou0-9]{4,5}/x uoie 1234 12345 aaaaa 123456 /\`(abc|def)=(\1){2,3}\'/x abc=abcabc def=defdefdef *** Failers abc=defdef /(cat(a(ract|tonic)|erpillar)) \1()2(3)/x cataract cataract23 catatonic catatonic23 caterpillar caterpillar23 /^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/x From abcd Mon Sep 01 12:33:02 1997 /^From[ \t]+[^ \t]+[ \t]+([a-zA-Z]{3}[ \t]+){2}[0-9]{1,2}[ \t]+[0-9][0-9]:[0-9][0-9]/x From abcd Mon Sep 01 12:33:02 1997 From abcd Mon Sep 1 12:33:02 1997 *** Failers From abcd Sep 01 12:33:02 1997 /^12.34/xs 12\n34 12\r34 /^(a)\1{2,3}(.)/x aaab aaaab aaaaab aaaaaab /^[ab]{1,3}(ab*|b)/x aabbbbb /^[ab]{1,3}(ab*|b)/x aabbbbb /^[ab]{1,3}(ab*|b)/x aabbbbb /^[ab]{1,3}(ab*|b)/x aabbbbb /abc\o0def\o00pqr\o000xyz\o0000AB/x abc\0def\00pqr\000xyz\0000AB abc456 abc\0def\00pqr\000xyz\0000ABCDE /abc\x0def\x00pqr\x000xyz\x0000AB/x abc\x0def\x00pqr\x000xyz\x0000AB abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE /^[\o000-\o037]/ \0A \01B \037C /\o0*/ \0\0\0\0 /A\x0{2,3}Z/x The A\x0\x0Z An A\0\x0\0Z *** Failers A\0Z A\0\x0\0\x0Z /^(cow|)\1(bell)/x cowcowbell bell *** Failers cowbell /^[ \t\n\r\f]/ \040abc \x0cabc \nabc \rabc \tabc *** Failers abc /^(a|)\1*b/x ab aaaab b *** Failers acb /^(a|)\1+b/x aab aaaab b *** Failers ab /^(a|)\1?b/x ab aab b *** Failers acb /^(a|)\1{2}b/x aaab b *** Failers ab aab aaaab /^(a|)\1{2,3}b/x aaab aaaab b *** Failers ab aab aaaaab /ab{1,3}bc/x abbbbc abbbc abbc *** Failers abc abbbbbc /([^.]*)\.([^:]*):[T ]+(.*)/x track1.title:TBlah blah blah /([^.]*)\.([^:]*):[T ]+(.*)/xi track1.title:TBlah blah blah /([^.]*)\.([^:]*):[t ]+(.*)/xi track1.title:TBlah blah blah /^[W-c]+$/x WXY_^abc ***Failers wxy /^[W-c]+$/xi WXY_^abc wxy_^ABC /^[\x3f-\x5F]+$/xi WXY_^abc wxy_^ABC /^abc$/ abc *** Failers qqq\nabc abc\nzzz qqq\nabc\nzzz /\`(.)*\'/xs abc\ndef /[-az]+/x az- *** Failers b /[az-]+/x za- *** Failers b /[az-]+/x a-z *** Failers b /[a-z]+/x abcdxyz /[0-9-]+/x 12-34 *** Failers aaa /[0-9-z]+/x 12-34z *** Failers aaa /\x5c/ \\ /\x20Z/ the Zoo *** Failers Zulu /(abc)\1/xi abcabc ABCabc abcABC /ab{3cd/ ab{3cd /ab{3,cd/ ab{3,cd /ab{3,4a}cd/ ab{3,4a}cd /{4,5a}bc/x {4,5a}bc /^a.b/ a\rb *** Failers a\nb /abc$/ abc *** Failers abc\n abc\ndef /(abc)\o123/x abc\x53 /(abc)\o223/x abc\x93 /(abc)\o323/x abc\xd3 /(abc)\500/x abc\x40 abc\100 /(abc)\5000/x abc\x400 abc\x40\x30 abc\1000 abc\100\x30 abc\100\060 abc\100\60 /abc\81/ abc\081 abc\0\x38\x31 /abc\91/ abc\091 abc\0\x39\x31 /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12/x abcdefghijkla2 /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\123/x abcdefghijka23 /ab\gdef/x abgdef /a{0}bc/x bc /(a|(bc)){0,0}xyz/x xyz /abc[\o10]de/x abc\010de /abc[\o1]de/x abc\1de /(abc)[\o1]de/x abc\1de /^([^a])([^\b])([^c]*)([^d]{3,4})/x baNOTccccd baNOTcccd baNOTccd bacccd *** Failers anything b\bc baccd /[^a]/ Abc /[^a]/i Abc /[^a]+/x AAAaAbc /[^a]+/xi AAAaAbc /[^a]+/x bbb\nccc /[^k]$/x abc *** Failers abk /[^k]{2,3}$/x abc kbc kabc *** Failers abk akb akk /^[0-9]{8,}\@.+[^k]$/x 12345678\@a.b.c.d 123456789\@x.y.z *** Failers 12345678\@x.y.uk 1234567\@a.b.c.d /(a)\1{8,}/x aaaaaaaaa aaaaaaaaaa *** Failers aaaaaaa /[^a]/x aaaabcd aaAabcd /[^a]/i aaaabcd aaAabcd /[^az]/x aaaabcd aaAabcd /[^az]/i aaaabcd aaAabcd /\o000\o001\o002\o003\o004\o005\o006\o007\o010\o011\o012\o013\o014\o015\o016\o017\o020\o021\o022\o023\o024\o025\o026\o027\o030\o031\o032\o033\o034\o035\o036\o037\o040\o041\o042\o043\o044\o045\o046\o047\o050\o051\o052\o053\o054\o055\o056\o057\o060\o061\o062\o063\o064\o065\o066\o067\o070\o071\o072\o073\o074\o075\o076\o077\o100\o101\o102\o103\o104\o105\o106\o107\o110\o111\o112\o113\o114\o115\o116\o117\o120\o121\o122\o123\o124\o125\o126\o127\o130\o131\o132\o133\o134\o135\o136\o137\o140\o141\o142\o143\o144\o145\o146\o147\o150\o151\o152\o153\o154\o155\o156\o157\o160\o161\o162\o163\o164\o165\o166\o167\o170\o171\o172\o173\o174\o175\o176\o177\o200\o201\o202\o203\o204\o205\o206\o207\o210\o211\o212\o213\o214\o215\o216\o217\o220\o221\o222\o223\o224\o225\o226\o227\o230\o231\o232\o233\o234\o235\o236\o237\o240\o241\o242\o243\o244\o245\o246\o247\o250\o251\o252\o253\o254\o255\o256\o257\o260\o261\o262\o263\o264\o265\o266\o267\o270\o271\o272\o273\o274\o275\o276\o277\o300\o301\o302\o303\o304\o305\o306\o307\o310\o311\o312\o313\o314\o315\o316\o317\o320\o321\o322\o323\o324\o325\o326\o327\o330\o331\o332\o333\o334\o335\o336\o337\o340\o341\o342\o343\o344\o345\o346\o347\o350\o351\o352\o353\o354\o355\o356\o357\o360\o361\o362\o363\o364\o365\o366\o367\o370\o371\o372\o373\o374\o375\o376\o377/ \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377 /P[^*]TAIRE[^*]{1,6}LL/x xxxxxxxxxxxPSTAIREISLLxxxxxxxxx /P[^*]TAIRE[^*]{1,}LL/x xxxxxxxxxxxPSTAIREISLLxxxxxxxxx /(\.[0-9][0-9][1-9]?)[0-9]+/x 1.230003938 1.875000282 1.235 /\b(foo)[ \t]+(\w+)/xi Food is on the foo table /foo(.*)bar/x The food is under the bar in the barn. /foo(.*)bar/x The food is under the bar in the barn. /(.*)([0-9]*)/x I have 2 numbers: 53147 /(.*)([0-9]+)/x I have 2 numbers: 53147 /(.*)([0-9]*)/x I have 2 numbers: 53147 /(.*)([0-9]+)/x I have 2 numbers: 53147 /(.*)([0-9]+)$/x I have 2 numbers: 53147 /(.*)([0-9]+)$/x I have 2 numbers: 53147 /(.*)\b([0-9]+)$/x I have 2 numbers: 53147 /(.*[^0-9])([0-9]+)$/x I have 2 numbers: 53147 /^[W-]46]/x W46]789 -46]789 *** Failers Wall Zebra 42 [abcd] ]abcd[ /^[W-\46]/x W46]789 Wall Zebra Xylophone 42 [abcd] \\backslash *** Failers -46]789 well /[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]/x 01/01/2000 /^(a){0,0}/x bcd abc aab /^(a){0,1}/x bcd abc aab /^(a){0,2}/x bcd abc aab /^(a){0,3}/x bcd abc aab aaa /^(a){0,}/x bcd abc aab aaa aaaaaaaa /^(a){1,1}/x abc aab *** Failers: bcd /^(a){1,2}/x abc aab *** Failers: bcd /^(a){1,3}/x abc aab aaa *** Failers: bcd /^(a){1,}/x abc aab aaa aaaaaaaa *** Failers: bcd /.*\.gif/x borfle\nbib.gif\nno /.{0,}\.gif/x borfle\nbib.gif\nno /^.*\.gif/xs borfle\nbib.gif\nno /.*$/ borfle\nbib.gif\nno /.*$/ *** Failers borfle\nbib.gif\nno\n /(.*X|^B)/x abcde\n1234Xyz BarFoo *** Failers abcde\nBar /^.*B/x **** Failers abc\nB /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/x 123456654321 /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ 123456654321 /^[abc]{12}/x abcabcabcabc /^[a-c]{12}/x abcabcabcabc /^(a|b|c){12}/x abcabcabcabc /^[abcdefghijklmnopqrstuvwxy0123456789]/x n *** Failers z /abcde{0,0}/x abcd *** Failers abce /ab[cd]{0,0}e/x abe *** Failers abcde /ab(c){0,0}d/x abd *** Failers abcd /a(b*)/x a ab abbbb *** Failers bbbbb /ab[0-9]{0}e/x abe *** Failers ab1e /"([^\\"]+|\\.)*"/x the \"quick\" brown fox \"the \\\"quick\\\" brown fox\" /.*/g+ abc /\b/g+ abc /\b/+g abc //g abc /a[^a]b/x acb a\nb /a.b/ acb *** Failers a\nb /^(b+|a){1,2}c/x bac bbac bbbac bbbbac bbbbbac /^(b+|a){1,2}c/x bac bbac bbbac bbbbac bbbbbac /\x0{ab}/ \0{ab} /(A|B)*CD/x CD /(A|B)*CD/x CD /(AB)*\1/x ABABAB /(AB)*\1/x ABABAB /[[.z.]]/ bbbccczzz bbbcccz *** Failers bbbccc /[[.z.]]+z/x bbbccczzz *** Failers bbbcccz bbbccc /[[=z=]]/ bbbccczzz bbbcccz *** Failers bbbccc /[[=z=]]+z/x bbbccczzz *** Failers bbbcccz bbbccc / End of testinput1 / sed-3.62/testsuite/pcre2p.good0000644000076600007660000007210510202632460013252 00000000000000/the quick brown fox/ the quick brown fox 0: the quick brown fox What do you know about the quick brown fox? 0: the quick brown fox *** Failers No match: POSIX code 17: match failed The quick brown FOX No match: POSIX code 17: match failed What do you know about THE QUICK BROWN FOX? No match: POSIX code 17: match failed /The quick brown fox/i the quick brown fox 0: the quick brown fox The quick brown FOX 0: The quick brown FOX What do you know about the quick brown fox? 0: the quick brown fox What do you know about THE QUICK BROWN FOX? 0: THE QUICK BROWN FOX /abcd\t\n\r\f\a\e\o071\x3b\$\\?caxyz/ abcd\t\n\r\f\a\e9;\$\\?caxyz 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/x abxyzpqrrrabbxyyyypqAzz 0: abxyzpqrrrabbxyyyypqAzz abxyzpqrrrabbxyyyypqAzz 0: abxyzpqrrrabbxyyyypqAzz aabxyzpqrrrabbxyyyypqAzz 0: aabxyzpqrrrabbxyyyypqAzz aaabxyzpqrrrabbxyyyypqAzz 0: aaabxyzpqrrrabbxyyyypqAzz aaaabxyzpqrrrabbxyyyypqAzz 0: aaaabxyzpqrrrabbxyyyypqAzz abcxyzpqrrrabbxyyyypqAzz 0: abcxyzpqrrrabbxyyyypqAzz aabcxyzpqrrrabbxyyyypqAzz 0: aabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypAzz 0: aaabcxyzpqrrrabbxyyyypAzz aaabcxyzpqrrrabbxyyyypqAzz 0: aaabcxyzpqrrrabbxyyyypqAzz aaabcxyzpqrrrabbxyyyypqqAzz 0: aaabcxyzpqrrrabbxyyyypqqAzz aaabcxyzpqrrrabbxyyyypqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqAzz aaabcxyzpqrrrabbxyyyypqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz aaabcxyzpqrrrabbxyyyypqqqqqqAzz 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz aaaabcxyzpqrrrabbxyyyypqAzz 0: aaaabcxyzpqrrrabbxyyyypqAzz abxyzzpqrrrabbxyyyypqAzz 0: abxyzzpqrrrabbxyyyypqAzz aabxyzzzpqrrrabbxyyyypqAzz 0: aabxyzzzpqrrrabbxyyyypqAzz aaabxyzzzzpqrrrabbxyyyypqAzz 0: aaabxyzzzzpqrrrabbxyyyypqAzz aaaabxyzzzzpqrrrabbxyyyypqAzz 0: aaaabxyzzzzpqrrrabbxyyyypqAzz abcxyzzpqrrrabbxyyyypqAzz 0: abcxyzzpqrrrabbxyyyypqAzz aabcxyzzzpqrrrabbxyyyypqAzz 0: aabcxyzzzpqrrrabbxyyyypqAzz aaabcxyzzzzpqrrrabbxyyyypqAzz 0: aaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbxyyyypqAzz 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyypqAzz 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz aaaabcxyzzzzpqrrrabbbxyyyyypqAzz 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz aaabcxyzpqrrrabbxyyyypABzz 0: aaabcxyzpqrrrabbxyyyypABzz aaabcxyzpqrrrabbxyyyypABBzz 0: aaabcxyzpqrrrabbxyyyypABBzz >>>aaabxyzpqrrrabbxyyyypqAzz 0: aaabxyzpqrrrabbxyyyypqAzz >aaaabxyzpqrrrabbxyyyypqAzz 0: aaaabxyzpqrrrabbxyyyypqAzz >>>>abcxyzpqrrrabbxyyyypqAzz 0: abcxyzpqrrrabbxyyyypqAzz *** Failers No match: POSIX code 17: match failed abxyzpqrrabbxyyyypqAzz No match: POSIX code 17: match failed abxyzpqrrrrabbxyyyypqAzz No match: POSIX code 17: match failed abxyzpqrrrabxyyyypqAzz No match: POSIX code 17: match failed aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz No match: POSIX code 17: match failed aaaabcxyzzzzpqrrrabbbxyyypqAzz No match: POSIX code 17: match failed aaabcxyzpqrrrabbxyyyypqqqqqqqAzz No match: POSIX code 17: match failed /^\(abc\)\{1,2\}zz/ abczz 0: abczz 1: abc abcabczz 0: abcabczz 1: abc *** Failers No match: POSIX code 17: match failed zz No match: POSIX code 17: match failed abcabcabczz No match: POSIX code 17: match failed >>abczz No match: POSIX code 17: match failed /^(b+|a){1,2}c/x bc 0: bc 1: b bbc 0: bbc 1: bb bbbc 0: bbbc 1: bbb bac 0: bac 1: a bbac 0: bbac 1: a aac 0: aac 1: a abbbbbbbbbbbc 0: abbbbbbbbbbbc 1: bbbbbbbbbbb bbbbbbbbbbbac 0: bbbbbbbbbbbac 1: a *** Failers No match: POSIX code 17: match failed aaac No match: POSIX code 17: match failed abbbbbbbbbbbac No match: POSIX code 17: match failed /^\(b\+\|a\)\{1,2\}c/ bc 0: bc 1: b bbc 0: bbc 1: bb bbbc 0: bbbc 1: bbb bac 0: bac 1: a bbac 0: bbac 1: a aac 0: aac 1: a abbbbbbbbbbbc 0: abbbbbbbbbbbc 1: bbbbbbbbbbb bbbbbbbbbbbac 0: bbbbbbbbbbbac 1: a *** Failers No match: POSIX code 17: match failed aaac No match: POSIX code 17: match failed abbbbbbbbbbbac No match: POSIX code 17: match failed /^(b+|a){1,2}?bc/x bbc 0: bbc 1: b /^ba*\(ba\)\?bc/ babc 0: babc bbabc 0: bbabc 1: ba bababc 0: bababc 1: ba *** Failers No match: POSIX code 17: match failed bababbc No match: POSIX code 17: match failed babababc No match: POSIX code 17: match failed # Under Perl rules, babc matches as this: # first repetition of (ba|b*) sets subexpression 1 to ba # second repetition of (ba|b*) sets subexpression 1 to the empty string # then bc matches # # Under Posix rules, however, "a subexpression repeated by an # asterisk ('*') _or an interval expression_ shall not match a # null expression unless this is the only match for the # repetition or it is necessary to satisfy the exact or # minimum number of occurrences for the interval expression." # This goes against the general rule for greedy matching, anyway # it matches as this: # first repetition of (ba|b*) sets subexpression 1 to ba # second repetition of (ba|b*) is void and ignored # bc matches /^(ba|b*){1,2}bc/x babc 0: babc 1: b bbabc 0: bbabc 1: ba babbbc 0: babbbc 1: bb *** Failers No match: POSIX code 17: match failed bababbc No match: POSIX code 17: match failed babababc No match: POSIX code 17: match failed /^\ca\cA\c[\c{\c:/x \x01\x01\e;z 0: \x01\x01\x1b;z /^[]cde]/ ]thing 0: ] cthing 0: c dthing 0: d ething 0: e *** Failers No match: POSIX code 17: match failed athing No match: POSIX code 17: match failed fthing No match: POSIX code 17: match failed /^[^]cde]/ athing 0: a fthing 0: f *** Failers 0: * ]thing No match: POSIX code 17: match failed cthing No match: POSIX code 17: match failed dthing No match: POSIX code 17: match failed ething No match: POSIX code 17: match failed /^\/ 0: \x81 /^ÿ/ ÿ 0: \xff /^[0-9]+$/x 0 0: 0 1 0: 1 2 0: 2 3 0: 3 4 0: 4 5 0: 5 6 0: 6 7 0: 7 8 0: 8 9 0: 9 10 0: 10 100 0: 100 *** Failers No match: POSIX code 17: match failed abc No match: POSIX code 17: match failed /^.*nter/x enter 0: enter inter 0: inter uponter 0: uponter /b*c*b+/x bbbb 0: bbbb /^xxx[0-9]+$/x xxx0 0: xxx0 xxx1234 0: xxx1234 *** Failers No match: POSIX code 17: match failed xxx No match: POSIX code 17: match failed /^.+[0-9][0-9][0-9]$/x x123 0: x123 xx123 0: xx123 123456 0: 123456 *** Failers No match: POSIX code 17: match failed 123 No match: POSIX code 17: match failed x1234 0: x1234 /^.+[0-9][0-9][0-9]$/x x123 0: x123 xx123 0: xx123 123456 0: 123456 *** Failers No match: POSIX code 17: match failed 123 No match: POSIX code 17: match failed x1234 0: x1234 /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/x abc!pqr=apquxz.ixr.zzz.ac.uk 0: abc!pqr=apquxz.ixr.zzz.ac.uk 1: abc 2: pqr *** Failers No match: POSIX code 17: match failed !pqr=apquxz.ixr.zzz.ac.uk No match: POSIX code 17: match failed abc!=apquxz.ixr.zzz.ac.uk No match: POSIX code 17: match failed abc!pqr=apquxz:ixr.zzz.ac.uk No match: POSIX code 17: match failed abc!pqr=apquxz.ixr.zzz.ac.ukk No match: POSIX code 17: match failed /:/ Well, we need a colon: somewhere 0: : *** Failers No match: POSIX code 17: match failed Fail if we don't No match: POSIX code 17: match failed /([0-9a-f:]+)$/xi 0abc 0: 0abc 1: 0abc abc 0: abc 1: abc fed 0: fed 1: fed E 0: E 1: E :: 0: :: 1: :: 5f03:12C0::932e 0: 5f03:12C0::932e 1: 5f03:12C0::932e fed def 0: def 1: def Any old stuff 0: ff 1: ff *** Failers No match: POSIX code 17: match failed 0zzz No match: POSIX code 17: match failed gzzz No match: POSIX code 17: match failed fed\x20 No match: POSIX code 17: match failed Any old rubbish No match: POSIX code 17: match failed /^.*\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/x .1.2.3 0: .1.2.3 1: 1 2: 2 3: 3 A.12.123.0 0: A.12.123.0 1: 12 2: 123 3: 0 *** Failers No match: POSIX code 17: match failed .1.2.3333 No match: POSIX code 17: match failed 1.2.3 No match: POSIX code 17: match failed 1234.2.3 No match: POSIX code 17: match failed /^([0-9]+)[ \t]+IN[ \t]+SOA[ \t]+([^ \t]+)[ \t]+([^ \t]+)[ \t]*\([ \t]*$/x 1 IN SOA non-sp1 non-sp2( 0: 1 IN SOA non-sp1 non-sp2( 1: 1 2: non-sp1 3: non-sp2 1 IN SOA non-sp1 non-sp2 ( 0: 1 IN SOA non-sp1 non-sp2 ( 1: 1 2: non-sp1 3: non-sp2 *** Failers No match: POSIX code 17: match failed 1IN SOA non-sp1 non-sp2( No match: POSIX code 17: match failed /^[a-zA-Z0-9][a-zA-Z0-9\-]*(\.[a-zA-Z0-9][a-zA-z0-9\-]*)*\.$/x a. 0: a. Z. 0: Z. 2. 0: 2. ab-c.pq-r. 0: ab-c.pq-r. 1: .pq-r sxk.zzz.ac.uk. 0: sxk.zzz.ac.uk. 1: .uk x-.y-. 0: x-.y-. 1: .y- *** Failers No match: POSIX code 17: match failed -abc.peq. No match: POSIX code 17: match failed /^[0-9a-f](\.[0-9a-f])*$/xi a.b.c.d 0: a.b.c.d 1: .d A.B.C.D 0: A.B.C.D 1: .D a.b.c.1.2.3.C 0: a.b.c.1.2.3.C 1: .C /^\".*\"[ \t]*(;.*)?$/x \"1234\" 0: "1234" \"abcd\" ; 0: "abcd" ; 1: ; \"\" ; rhubarb 0: "" ; rhubarb 1: ; rhubarb *** Failers No match: POSIX code 17: match failed \"1234\" : things No match: POSIX code 17: match failed /^$/ \ 0: *** Failers No match: POSIX code 17: match failed /^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/x abcdefhijklm 0: abcdefhijklm 1: abc 2: bc 3: c 4: def 5: ef 6: f 7: hij 8: ij 9: j 10: klm 11: lm 12: m /^[A-Za-z_][^A-Za-z_][ \t][^ \t][0-9][^0-9]\x08[\n][\c]][\o022]/x a+ Z0+\x08\n\x1d\x12 0: a+ Z0+\x08\x0a\x1d\x12 /^[.^\\$|()*+?{,}]\+/ .^\$(*+)|{?,?} 0: .^$(*+)|{?,?} /^a*\w/x z 0: z az 0: az aaaz 0: aaaz a 0: a aa 0: aa aaaa 0: aaaa a+ 0: a aa+ 0: aa /^a*\w/ z 0: z az 0: az aaaz 0: aaaz a 0: a aa 0: aa aaaa 0: aaaa a+ 0: a aa+ 0: aa /^a+\w/x az 0: az aaaz 0: aaaz aa 0: aa aaaa 0: aaaa aa+ 0: aa /^a\+\w/ az 0: az aaaz 0: aaaz aa 0: aa aaaa 0: aaaa aa+ 0: aa /^[0-9]{8}\w{2,}/x 1234567890 0: 1234567890 12345678ab 0: 12345678ab 12345678__ 0: 12345678__ *** Failers No match: POSIX code 17: match failed 1234567 No match: POSIX code 17: match failed /^[aeiou0-9]{4,5}$/x uoie 0: uoie 1234 0: 1234 12345 0: 12345 aaaaa 0: aaaaa *** Failers No match: POSIX code 17: match failed 123456 No match: POSIX code 17: match failed /^[aeiou0-9]{4,5}/x uoie 0: uoie 1234 0: 1234 12345 0: 12345 aaaaa 0: aaaaa 123456 0: 12345 /\`(abc|def)=(\1){2,3}\'/x abc=abcabc 0: abc=abcabc 1: abc 2: abc def=defdefdef 0: def=defdefdef 1: def 2: def *** Failers No match: POSIX code 17: match failed abc=defdef No match: POSIX code 17: match failed /(cat(a(ract|tonic)|erpillar)) \1()2(3)/x cataract cataract23 0: cataract cataract23 1: cataract 2: aract 3: ract 4: 5: 3 catatonic catatonic23 0: catatonic catatonic23 1: catatonic 2: atonic 3: tonic 4: 5: 3 caterpillar caterpillar23 0: caterpillar caterpillar23 1: caterpillar 2: erpillar 4: 5: 3 /^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/x From abcd Mon Sep 01 12:33:02 1997 0: From abcd Mon Sep 01 12:33 1: abcd /^From[ \t]+[^ \t]+[ \t]+([a-zA-Z]{3}[ \t]+){2}[0-9]{1,2}[ \t]+[0-9][0-9]:[0-9][0-9]/x From abcd Mon Sep 01 12:33:02 1997 0: From abcd Mon Sep 01 12:33 1: Sep From abcd Mon Sep 1 12:33:02 1997 0: From abcd Mon Sep 1 12:33 1: Sep *** Failers No match: POSIX code 17: match failed From abcd Sep 01 12:33:02 1997 No match: POSIX code 17: match failed /^12.34/xs 12\n34 0: 12\x0a34 12\r34 0: 12\x0d34 /^(a)\1{2,3}(.)/x aaab 0: aaab 1: a 2: b aaaab 0: aaaab 1: a 2: b aaaaab 0: aaaaa 1: a 2: a aaaaaab 0: aaaaa 1: a 2: a /^[ab]{1,3}(ab*|b)/x aabbbbb 0: aabb 1: b /^[ab]{1,3}(ab*|b)/x aabbbbb 0: aabb 1: b /^[ab]{1,3}(ab*|b)/x aabbbbb 0: aabb 1: b /^[ab]{1,3}(ab*|b)/x aabbbbb 0: aabb 1: b /abc\o0def\o00pqr\o000xyz\o0000AB/x abc\0def\00pqr\000xyz\0000AB 0: abc\x00def\x00pqr\x00xyz\x000AB abc456 abc\0def\00pqr\000xyz\0000ABCDE 0: abc\x00def\x00pqr\x00xyz\x000AB /abc\x0def\x00pqr\x000xyz\x0000AB/x abc\x0def\x00pqr\x000xyz\x0000AB 0: abc\x0def\x00pqr\x000xyz\x0000AB abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE 0: abc\x0def\x00pqr\x000xyz\x0000AB /^[\o000-\o037]/ \0A 0: \x00 \01B 0: \x01 \037C 0: \x1f /\o0*/ \0\0\0\0 0: \x00\x00\x00\x00 /A\x0{2,3}Z/x The A\x0\x0Z 0: A\x00\x00Z An A\0\x0\0Z 0: A\x00\x00\x00Z *** Failers No match: POSIX code 17: match failed A\0Z No match: POSIX code 17: match failed A\0\x0\0\x0Z No match: POSIX code 17: match failed /^(cow|)\1(bell)/x cowcowbell 0: cowcowbell 1: cow 2: bell bell 0: bell 1: 2: bell *** Failers No match: POSIX code 17: match failed cowbell No match: POSIX code 17: match failed /^[ \t\n\r\f]/ \040abc 0: \x0cabc 0: \x0c \nabc 0: \x0a \rabc 0: \x0d \tabc 0: \x09 *** Failers No match: POSIX code 17: match failed abc No match: POSIX code 17: match failed /^(a|)\1*b/x ab 0: ab 1: a aaaab 0: aaaab 1: a b 0: b 1: *** Failers No match: POSIX code 17: match failed acb No match: POSIX code 17: match failed /^(a|)\1+b/x aab 0: aab 1: a aaaab 0: aaaab 1: a b 0: b 1: *** Failers No match: POSIX code 17: match failed ab No match: POSIX code 17: match failed /^(a|)\1?b/x ab 0: ab 1: a aab 0: aab 1: a b 0: b 1: *** Failers No match: POSIX code 17: match failed acb No match: POSIX code 17: match failed /^(a|)\1{2}b/x aaab 0: aaab 1: a b 0: b 1: *** Failers No match: POSIX code 17: match failed ab No match: POSIX code 17: match failed aab No match: POSIX code 17: match failed aaaab No match: POSIX code 17: match failed /^(a|)\1{2,3}b/x aaab 0: aaab 1: a aaaab 0: aaaab 1: a b 0: b 1: *** Failers No match: POSIX code 17: match failed ab No match: POSIX code 17: match failed aab No match: POSIX code 17: match failed aaaaab No match: POSIX code 17: match failed /ab{1,3}bc/x abbbbc 0: abbbbc abbbc 0: abbbc abbc 0: abbc *** Failers No match: POSIX code 17: match failed abc No match: POSIX code 17: match failed abbbbbc No match: POSIX code 17: match failed /([^.]*)\.([^:]*):[T ]+(.*)/x track1.title:TBlah blah blah 0: track1.title:TBlah blah blah 1: track1 2: title 3: Blah blah blah /([^.]*)\.([^:]*):[T ]+(.*)/xi track1.title:TBlah blah blah 0: track1.title:TBlah blah blah 1: track1 2: title 3: Blah blah blah /([^.]*)\.([^:]*):[t ]+(.*)/xi track1.title:TBlah blah blah 0: track1.title:TBlah blah blah 1: track1 2: title 3: Blah blah blah /^[W-c]+$/x WXY_^abc 0: WXY_^abc ***Failers No match: POSIX code 17: match failed wxy No match: POSIX code 17: match failed /^[W-c]+$/xi WXY_^abc 0: WXY_^abc wxy_^ABC 0: wxy_^ABC /^[\x3f-\x5F]+$/xi WXY_^abc 0: WXY_^abc wxy_^ABC 0: wxy_^ABC /^abc$/ abc 0: abc *** Failers No match: POSIX code 17: match failed qqq\nabc No match: POSIX code 17: match failed abc\nzzz No match: POSIX code 17: match failed qqq\nabc\nzzz No match: POSIX code 17: match failed /\`(.)*\'/xs abc\ndef 0: abc\x0adef 1: f /[-az]+/x az- 0: az- *** Failers 0: a b No match: POSIX code 17: match failed /[az-]+/x za- 0: za- *** Failers 0: a b No match: POSIX code 17: match failed /[az-]+/x a-z 0: a-z *** Failers 0: a b No match: POSIX code 17: match failed /[a-z]+/x abcdxyz 0: abcdxyz /[0-9-]+/x 12-34 0: 12-34 *** Failers No match: POSIX code 17: match failed aaa No match: POSIX code 17: match failed /[0-9-z]+/x 12-34z 0: 12-34z *** Failers No match: POSIX code 17: match failed aaa No match: POSIX code 17: match failed /\x5c/ \\ 0: \ /\x20Z/ the Zoo 0: Z *** Failers No match: POSIX code 17: match failed Zulu No match: POSIX code 17: match failed /(abc)\1/xi abcabc 0: abcabc 1: abc ABCabc 0: ABCabc 1: ABC abcABC 0: abcABC 1: abc /ab{3cd/ ab{3cd 0: ab{3cd /ab{3,cd/ ab{3,cd 0: ab{3,cd /ab{3,4a}cd/ ab{3,4a}cd 0: ab{3,4a}cd /{4,5a}bc/x {4,5a}bc 0: {4,5a}bc /^a.b/ a\rb 0: a\x0db *** Failers No match: POSIX code 17: match failed a\nb 0: a\x0ab /abc$/ abc 0: abc *** Failers No match: POSIX code 17: match failed abc\n No match: POSIX code 17: match failed abc\ndef No match: POSIX code 17: match failed /(abc)\o123/x abc\x53 0: abcS 1: abc /(abc)\o223/x abc\x93 0: abc\x93 1: abc /(abc)\o323/x abc\xd3 0: abc\xd3 1: abc /(abc)\500/x Failed: POSIX code 15: back reference to non-existent subpattern at offset 9 /(abc)\5000/x Failed: POSIX code 15: back reference to non-existent subpattern at offset 10 /abc\81/ Failed: POSIX code 15: back reference to non-existent subpattern at offset 6 /abc\91/ Failed: POSIX code 15: back reference to non-existent subpattern at offset 6 /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12/x abcdefghijkla2 0: abcdefghijkla2 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k 12: l /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\123/x abcdefghijka23 0: abcdefghijka23 1: a 2: b 3: c 4: d 5: e 6: f 7: g 8: h 9: i 10: j 11: k /ab\gdef/x abgdef 0: abgdef /a{0}bc/x bc 0: bc /(a|(bc)){0,0}xyz/x xyz 0: xyz /abc[\o10]de/x abc\010de 0: abc\x08de /abc[\o1]de/x abc\1de 0: abc\x01de /(abc)[\o1]de/x abc\1de 0: abc\x01de 1: abc /^([^a])([^\b])([^c]*)([^d]{3,4})/x baNOTccccd 0: baNOTcccc 1: b 2: a 3: NOT 4: cccc baNOTcccd 0: baNOTccc 1: b 2: a 3: NOT 4: ccc baNOTccd 0: baNOTcc 1: b 2: a 3: NO 4: Tcc bacccd 0: baccc 1: b 2: a 3: 4: ccc *** Failers 0: *** Failers 1: * 2: * 3: * Fail 4: ers anything No match: POSIX code 17: match failed b\bc No match: POSIX code 17: match failed baccd No match: POSIX code 17: match failed /[^a]/ Abc 0: A /[^a]/i Abc 0: b /[^a]+/x AAAaAbc 0: AAA /[^a]+/xi AAAaAbc 0: bc /[^a]+/x bbb\nccc 0: bbb\x0accc /[^k]$/x abc 0: c *** Failers 0: s abk No match: POSIX code 17: match failed /[^k]{2,3}$/x abc 0: abc kbc 0: bc kabc 0: abc *** Failers 0: ers abk No match: POSIX code 17: match failed akb No match: POSIX code 17: match failed akk No match: POSIX code 17: match failed /^[0-9]{8,}\@.+[^k]$/x 12345678\@a.b.c.d 0: 12345678@a.b.c.d 123456789\@x.y.z 0: 123456789@x.y.z *** Failers No match: POSIX code 17: match failed 12345678\@x.y.uk No match: POSIX code 17: match failed 1234567\@a.b.c.d No match: POSIX code 17: match failed /(a)\1{8,}/x aaaaaaaaa 0: aaaaaaaaa 1: a aaaaaaaaaa 0: aaaaaaaaaa 1: a *** Failers No match: POSIX code 17: match failed aaaaaaa No match: POSIX code 17: match failed /[^a]/x aaaabcd 0: b aaAabcd 0: A /[^a]/i aaaabcd 0: b aaAabcd 0: b /[^az]/x aaaabcd 0: b aaAabcd 0: A /[^az]/i aaaabcd 0: b aaAabcd 0: b /\o000\o001\o002\o003\o004\o005\o006\o007\o010\o011\o012\o013\o014\o015\o016\o017\o020\o021\o022\o023\o024\o025\o026\o027\o030\o031\o032\o033\o034\o035\o036\o037\o040\o041\o042\o043\o044\o045\o046\o047\o050\o051\o052\o053\o054\o055\o056\o057\o060\o061\o062\o063\o064\o065\o066\o067\o070\o071\o072\o073\o074\o075\o076\o077\o100\o101\o102\o103\o104\o105\o106\o107\o110\o111\o112\o113\o114\o115\o116\o117\o120\o121\o122\o123\o124\o125\o126\o127\o130\o131\o132\o133\o134\o135\o136\o137\o140\o141\o142\o143\o144\o145\o146\o147\o150\o151\o152\o153\o154\o155\o156\o157\o160\o161\o162\o163\o164\o165\o166\o167\o170\o171\o172\o173\o174\o175\o176\o177\o200\o201\o202\o203\o204\o205\o206\o207\o210\o211\o212\o213\o214\o215\o216\o217\o220\o221\o222\o223\o224\o225\o226\o227\o230\o231\o232\o233\o234\o235\o236\o237\o240\o241\o242\o243\o244\o245\o246\o247\o250\o251\o252\o253\o254\o255\o256\o257\o260\o261\o262\o263\o264\o265\o266\o267\o270\o271\o272\o273\o274\o275\o276\o277\o300\o301\o302\o303\o304\o305\o306\o307\o310\o311\o312\o313\o314\o315\o316\o317\o320\o321\o322\o323\o324\o325\o326\o327\o330\o331\o332\o333\o334\o335\o336\o337\o340\o341\o342\o343\o344\o345\o346\o347\o350\o351\o352\o353\o354\o355\o356\o357\o360\o361\o362\o363\o364\o365\o366\o367\o370\o371\o372\o373\o374\o375\o376\o377/ \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377 0: \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff /P[^*]TAIRE[^*]{1,6}LL/x xxxxxxxxxxxPSTAIREISLLxxxxxxxxx 0: PSTAIREISLL /P[^*]TAIRE[^*]{1,}LL/x xxxxxxxxxxxPSTAIREISLLxxxxxxxxx 0: PSTAIREISLL /(\.[0-9][0-9][1-9]?)[0-9]+/x 1.230003938 0: .230003938 1: .23 1.875000282 0: .875000282 1: .875 1.235 0: .235 1: .23 /\b(foo)[ \t]+(\w+)/xi Food is on the foo table 0: foo table 1: foo 2: table /foo(.*)bar/x The food is under the bar in the barn. 0: food is under the bar in the bar 1: d is under the bar in the /foo(.*)bar/x The food is under the bar in the barn. 0: food is under the bar in the bar 1: d is under the bar in the /(.*)([0-9]*)/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 53147 2: /(.*)([0-9]+)/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*)([0-9]*)/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 53147 2: /(.*)([0-9]+)/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*)([0-9]+)$/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*)([0-9]+)$/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 5314 2: 7 /(.*)\b([0-9]+)$/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /(.*[^0-9])([0-9]+)$/x I have 2 numbers: 53147 0: I have 2 numbers: 53147 1: I have 2 numbers: 2: 53147 /^[W-]46]/x W46]789 0: W46] -46]789 0: -46] *** Failers No match: POSIX code 17: match failed Wall No match: POSIX code 17: match failed Zebra No match: POSIX code 17: match failed 42 No match: POSIX code 17: match failed [abcd] No match: POSIX code 17: match failed ]abcd[ No match: POSIX code 17: match failed /^[W-\46]/x W46]789 0: W Wall 0: W Zebra 0: Z Xylophone 0: X 42 0: 4 [abcd] 0: [ \\backslash 0: \ *** Failers No match: POSIX code 17: match failed -46]789 No match: POSIX code 17: match failed well No match: POSIX code 17: match failed /[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]/x 01/01/2000 0: 01/01/2000 /^(a){0,0}/x bcd 0: abc 0: aab 0: /^(a){0,1}/x bcd 0: abc 0: a 1: a aab 0: a 1: a /^(a){0,2}/x bcd 0: abc 0: a 1: a aab 0: aa 1: a /^(a){0,3}/x bcd 0: abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a /^(a){0,}/x bcd 0: abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a aaaaaaaa 0: aaaaaaaa 1: a /^(a){1,1}/x abc 0: a 1: a aab 0: a 1: a *** Failers: No match: POSIX code 17: match failed bcd No match: POSIX code 17: match failed /^(a){1,2}/x abc 0: a 1: a aab 0: aa 1: a *** Failers: No match: POSIX code 17: match failed bcd No match: POSIX code 17: match failed /^(a){1,3}/x abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a *** Failers: No match: POSIX code 17: match failed bcd No match: POSIX code 17: match failed /^(a){1,}/x abc 0: a 1: a aab 0: aa 1: a aaa 0: aaa 1: a aaaaaaaa 0: aaaaaaaa 1: a *** Failers: No match: POSIX code 17: match failed bcd No match: POSIX code 17: match failed /.*\.gif/x borfle\nbib.gif\nno 0: borfle\x0abib.gif /.{0,}\.gif/x borfle\nbib.gif\nno 0: borfle\x0abib.gif /^.*\.gif/xs borfle\nbib.gif\nno 0: borfle\x0abib.gif /.*$/ borfle\nbib.gif\nno 0: borfle\x0abib.gif\x0ano /.*$/ *** Failers 0: *** Failers borfle\nbib.gif\nno\n 0: borfle\x0abib.gif\x0ano\x0a /(.*X|^B)/x abcde\n1234Xyz 0: abcde\x0a1234X 1: abcde\x0a1234X BarFoo 0: B 1: B *** Failers No match: POSIX code 17: match failed abcde\nBar No match: POSIX code 17: match failed /^.*B/x **** Failers No match: POSIX code 17: match failed abc\nB 0: abc\x0aB /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/x 123456654321 0: 123456654321 /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ 123456654321 0: 123456654321 /^[abc]{12}/x abcabcabcabc 0: abcabcabcabc /^[a-c]{12}/x abcabcabcabc 0: abcabcabcabc /^(a|b|c){12}/x abcabcabcabc 0: abcabcabcabc 1: c /^[abcdefghijklmnopqrstuvwxy0123456789]/x n 0: n *** Failers No match: POSIX code 17: match failed z No match: POSIX code 17: match failed /abcde{0,0}/x abcd 0: abcd *** Failers No match: POSIX code 17: match failed abce No match: POSIX code 17: match failed /ab[cd]{0,0}e/x abe 0: abe *** Failers No match: POSIX code 17: match failed abcde No match: POSIX code 17: match failed /ab(c){0,0}d/x abd 0: abd *** Failers No match: POSIX code 17: match failed abcd No match: POSIX code 17: match failed /a(b*)/x a 0: a 1: ab 0: ab 1: b abbbb 0: abbbb 1: bbbb *** Failers 0: a 1: bbbbb No match: POSIX code 17: match failed /ab[0-9]{0}e/x abe 0: abe *** Failers No match: POSIX code 17: match failed ab1e No match: POSIX code 17: match failed /"([^\\"]+|\\.)*"/x the \"quick\" brown fox 0: "quick" 1: quick \"the \\\"quick\\\" brown fox\" 0: "the \"quick\" brown fox" 1: brown fox /.*/g+ abc 0: abc 0+ /\b/g+ abc 0: 0+ abc /\b/+g abc 0: 0+ abc //g abc 0: /a[^a]b/x acb 0: acb a\nb 0: a\x0ab /a.b/ acb 0: acb *** Failers No match: POSIX code 17: match failed a\nb 0: a\x0ab /^(b+|a){1,2}c/x bac 0: bac 1: a bbac 0: bbac 1: a bbbac 0: bbbac 1: a bbbbac 0: bbbbac 1: a bbbbbac 0: bbbbbac 1: a /^(b+|a){1,2}c/x bac 0: bac 1: a bbac 0: bbac 1: a bbbac 0: bbbac 1: a bbbbac 0: bbbbac 1: a bbbbbac 0: bbbbbac 1: a /\x0{ab}/ \0{ab} 0: \x00{ab} /(A|B)*CD/x CD 0: CD /(A|B)*CD/x CD 0: CD /(AB)*\1/x ABABAB 0: ABABAB 1: AB /(AB)*\1/x ABABAB 0: ABABAB 1: AB /[[.z.]]/ bbbccczzz 0: z bbbcccz 0: z *** Failers No match: POSIX code 17: match failed bbbccc No match: POSIX code 17: match failed /[[.z.]]+z/x bbbccczzz 0: zzz *** Failers No match: POSIX code 17: match failed bbbcccz No match: POSIX code 17: match failed bbbccc No match: POSIX code 17: match failed /[[=z=]]/ bbbccczzz 0: z bbbcccz 0: z *** Failers No match: POSIX code 17: match failed bbbccc No match: POSIX code 17: match failed /[[=z=]]+z/x bbbccczzz 0: zzz *** Failers No match: POSIX code 17: match failed bbbcccz No match: POSIX code 17: match failed bbbccc No match: POSIX code 17: match failed / End of testinput1 / sed-3.62/testsuite/pcre3.good0000644000076600007660000007132510143133572013102 00000000000000/(?.*/)foo" /this/is/a/very/long/line/indeed/with/very/many/slashes/in/it/and/foo 0: /this/is/a/very/long/line/indeed/with/very/many/slashes/in/it/and/foo *** Failers No match /this/is/a/very/long/line/indeed/with/foo/in/the/wrong/place No match /(?>(\.\d\d[1-9]?))\d+/ 1.230003938 0: .230003938 1: .23 1.875000282 0: .875000282 1: .875 *** Failers No match 1.235 No match /^((?>\w+)|(?>\s+))*$/ now is the time for all good men to come to the aid of the party 0: now is the time for all good men to come to the aid of the party 1: party *** Failers No match this is not a line with only words and spaces! No match /(\d+)(\w)/ 12345a 0: 12345a 1: 12345 2: a 12345+ 0: 12345 1: 1234 2: 5 /((?>\d+))(\w)/ 12345a 0: 12345a 1: 12345 2: a *** Failers No match 12345+ No match /(?>a+)b/ aaab 0: aaab /((?>a+)b)/ aaab 0: aaab 1: aaab /(?>(a+))b/ aaab 0: aaab 1: aaa /(?>b)+/ aaabbbccc 0: bbb /(?>a+|b+|c+)*c/ aaabbbbccccd 0: aaabbbbc /((?>[^()]+)|\([^()]*\))+/ ((abc(ade)ufh()()x 0: abc(ade)ufh()()x 1: x /\(((?>[^()]+)|\([^()]+\))+\)/ (abc) 0: (abc) 1: abc (abc(def)xyz) 0: (abc(def)xyz) 1: xyz *** Failers No match ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa No match /a(?-i)b/i ab 0: ab *** Failers No match Ab No match aB No match AB No match /(a (?x)b c)d e/ a bcd e 0: a bcd e 1: a bc *** Failers No match a b cd e No match abcd e No match a bcde No match /(a b(?x)c d (?-x)e f)/ a bcde f 0: a bcde f 1: a bcde f *** Failers No match abcdef No match /(a(?i)b)c/ abc 0: abc 1: ab aBc 0: aBc 1: aB *** Failers No match abC No match aBC No match Abc No match ABc No match ABC No match AbC No match /a(?i:b)c/ abc 0: abc aBc 0: aBc *** Failers No match ABC No match abC No match aBC No match /a(?i:b)*c/ aBc 0: aBc aBBc 0: aBBc *** Failers No match aBC No match aBBC No match /a(?=b(?i)c)\w\wd/ abcd 0: abcd abCd 0: abCd *** Failers No match aBCd No match abcD No match /(?s-i:more.*than).*million/i more than million 0: more than million more than MILLION 0: more than MILLION more \n than Million 0: more \x0a than Million *** Failers No match MORE THAN MILLION No match more \n than \n million No match /(?:(?s-i)more.*than).*million/i more than million 0: more than million more than MILLION 0: more than MILLION more \n than Million 0: more \x0a than Million *** Failers No match MORE THAN MILLION No match more \n than \n million No match /(?>a(?i)b+)+c/ abc 0: abc aBbc 0: aBbc aBBc 0: aBBc *** Failers No match Abc No match abAb No match abbC No match /(?=a(?i)b)\w\wc/ abc 0: abc aBc 0: aBc *** Failers No match Ab No match abC No match aBC No match /(?<=a(?i)b)(\w\w)c/ abxxc 0: xxc 1: xx aBxxc 0: xxc 1: xx *** Failers No match Abxxc No match ABxxc No match abxxC No match /(?:(a)|b)(?(1)A|B)/ aA 0: aA 1: a bB 0: bB *** Failers No match aB No match bA No match /^(a)?(?(1)a|b)+$/ aa 0: aa 1: a b 0: b bb 0: bb *** Failers No match ab No match /^(?(?=abc)\w{3}:|\d\d)$/ abc: 0: abc: 12 0: 12 *** Failers No match 123 No match xyz No match /^(?(?!abc)\d\d|\w{3}:)$/ abc: 0: abc: 12 0: 12 *** Failers No match 123 No match xyz No match /(?(?<=foo)bar|cat)/ foobar 0: bar cat 0: cat fcat 0: cat focat 0: cat *** Failers No match foocat No match /(?(?a*)*/ a 0: a aa 0: aa aaaa 0: aaaa /(abc|)+/ abc 0: abc 1: abcabc 0: abcabc 1: abcabcabc 0: abcabcabc 1: xyz 0: 1: /([a]*)*/ a 0: a 1: aaaaa 0: aaaaa 1: /([ab]*)*/ a 0: a 1: b 0: b 1: ababab 0: ababab 1: aaaabcde 0: aaaab 1: bbbb 0: bbbb 1: /([^a]*)*/ b 0: b 1: bbbb 0: bbbb 1: aaa 0: 1: /([^ab]*)*/ cccc 0: cccc 1: abab 0: 1: /([a]*?)*/ a 0: 1: aaaa 0: 1: /([ab]*?)*/ a 0: 1: b 0: 1: abab 0: 1: baba 0: 1: /([^a]*?)*/ b 0: 1: bbbb 0: 1: aaa 0: 1: /([^ab]*?)*/ c 0: 1: cccc 0: 1: baba 0: 1: /(?>a*)*/ a 0: a aaabcde 0: aaa /((?>a*))*/ aaaaa 0: aaaaa 1: aabbaa 0: aa 1: /((?>a*?))*/ aaaaa 0: 1: aabbaa 0: 1: /(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x 12-sep-98 0: 12-sep-98 12-09-98 0: 12-09-98 *** Failers No match sep-12-98 No match /(?<=(foo))bar\1/ foobarfoo 0: barfoo 1: foo foobarfootling 0: barfoo 1: foo *** Failers No match foobar No match barfoo No match /(?i:saturday|sunday)/ saturday 0: saturday sunday 0: sunday Saturday 0: Saturday Sunday 0: Sunday SATURDAY 0: SATURDAY SUNDAY 0: SUNDAY SunDay 0: SunDay /(a(?i)bc|BB)x/ abcx 0: abcx 1: abc aBCx 0: aBCx 1: aBC bbx 0: bbx 1: bb BBx 0: BBx 1: BB *** Failers No match abcX No match aBCX No match bbX No match BBX No match /^([ab](?i)[cd]|[ef])/ ac 0: ac 1: ac aC 0: aC 1: aC bD 0: bD 1: bD elephant 0: e 1: e Europe 0: E 1: E frog 0: f 1: f France 0: F 1: F *** Failers No match Africa No match /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ ab 0: ab 1: ab aBd 0: aBd 1: aBd xy 0: xy 1: xy xY 0: xY 1: xY zebra 0: z 1: z Zambesi 0: Z 1: Z *** Failers No match aCD No match XY No match /(?<=foo\n)^bar/m foo\nbar 0: bar *** Failers No match bar No match baz\nbar No match /(?<=(?]&/ <&OUT 0: <& /^(a\1?){4}$/ aaaaaaaaaa 0: aaaaaaaaaa 1: aaaa *** Failers No match AB No match aaaaaaaaa No match aaaaaaaaaaa No match /^(a(?(1)\1)){4}$/ aaaaaaaaaa 0: aaaaaaaaaa 1: aaaa *** Failers No match aaaaaaaaa No match aaaaaaaaaaa No match /(?:(f)(o)(o)|(b)(a)(r))*/ foobar 0: foobar 1: f 2: o 3: o 4: b 5: a 6: r /(?<=a)b/ ab 0: b *** Failers No match cb No match b No match /(? 2: abcd xy:z:::abcd 0: xy:z:::abcd 1: xy:z::: 2: abcd /^[^bcd]*(c+)/ aexycd 0: aexyc 1: c /(a*)b+/ caab 0: aab 1: aa /([\w:]+::)?(\w+)$/ abcd 0: abcd 1: 2: abcd xy:z:::abcd 0: xy:z:::abcd 1: xy:z::: 2: abcd *** Failers 0: Failers 1: 2: Failers abcd: No match abcd: No match /^[^bcd]*(c+)/ aexycd 0: aexyc 1: c /(>a+)ab/ /(?>a+)b/ aaab 0: aaab /([[:]+)/ a:[b]: 0: :[ 1: :[ /([[=]+)/ a=[b]= 0: =[ 1: =[ /([[.]+)/ a.[b]. 0: .[ 1: .[ /((?>a+)b)/ aaab 0: aaab 1: aaab /(?>(a+))b/ aaab 0: aaab 1: aaa /((?>[^()]+)|\([^()]*\))+/ ((abc(ade)ufh()()x 0: abc(ade)ufh()()x 1: x /a\Z/ *** Failers No match aaab No match a\nb\n No match /b\Z/ a\nb\n 0: b /b\z/ /b\Z/ a\nb 0: b /b\z/ a\nb 0: b *** Failers No match /^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ a 0: a 1: abc 0: abc 1: a-b 0: a-b 1: 0-9 0: 0-9 1: a.b 0: a.b 1: 5.6.7 0: 5.6.7 1: the.quick.brown.fox 0: the.quick.brown.fox 1: a100.b200.300c 0: a100.b200.300c 1: 12-ab.1245 0: 12-ab.1245 1: ***Failers No match \ No match .a No match -a No match a- No match a. No match a_b No match a.- No match a.. No match ab..bc No match the.quick.brown.fox- No match the.quick.brown.fox. No match the.quick.brown.fox_ No match the.quick.brown.fox+ No match /(?>.*)(?<=(abcd|wxyz))/ alphabetabcd 0: alphabetabcd 1: abcd endingwxyz 0: endingwxyz 1: wxyz *** Failers No match a rather long string that doesn't end with one of them No match /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ word cat dog elephant mussel cow horse canary baboon snake shark otherword 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword *** Failers No match word cat dog elephant mussel cow horse canary baboon snake shark No match /word (?>[a-zA-Z0-9]+ ){0,30}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope otherword 0: word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope otherword *** Failers No match word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope No match word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope one too many otherword No match /(?<=\d{3}(?!999))foo/ 999foo 0: foo 123999foo 0: foo *** Failers No match 123abcfoo No match /(?<=(?!...999)\d{3})foo/ 999foo 0: foo 123999foo 0: foo *** Failers No match 123abcfoo No match /(?<=\d{3}(?!999)...)foo/ 123abcfoo 0: foo 123456foo 0: foo *** Failers No match 123999foo No match /(?<=\d{3}...)(? 2: 3: abcd
    2: 3: abcd \s*)=(?>\s*) # find 2: 3: abcd Z)+|A)*/ ZABCDEFG 0: ZA 1: A /((?>)+|A)*/ ZABCDEFG 0: 1: /a*/g abbab 0: a 0: 0: 0: a 0: 0: /^[a-\d]/ abcde 0: a -things 0: - 0digit 0: 0 *** Failers No match bcdef No match /^[\d-a]/ abcde 0: a -things 0: - 0digit 0: 0 *** Failers No match bcdef No match /a*(a{2}b)/ aaaab 0: aaaab 1: aab / End of testinput3 / sed-3.62/testsuite/pcre3.inp0000644000076600007660000004372410143133572012742 00000000000000/(?.*/)foo" /this/is/a/very/long/line/indeed/with/very/many/slashes/in/it/and/foo *** Failers /this/is/a/very/long/line/indeed/with/foo/in/the/wrong/place /(?>(\.\d\d[1-9]?))\d+/ 1.230003938 1.875000282 *** Failers 1.235 /^((?>\w+)|(?>\s+))*$/ now is the time for all good men to come to the aid of the party *** Failers this is not a line with only words and spaces! /(\d+)(\w)/ 12345a 12345+ /((?>\d+))(\w)/ 12345a *** Failers 12345+ /(?>a+)b/ aaab /((?>a+)b)/ aaab /(?>(a+))b/ aaab /(?>b)+/ aaabbbccc /(?>a+|b+|c+)*c/ aaabbbbccccd /((?>[^()]+)|\([^()]*\))+/ ((abc(ade)ufh()()x /\(((?>[^()]+)|\([^()]+\))+\)/ (abc) (abc(def)xyz) *** Failers ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa /a(?-i)b/i ab *** Failers Ab aB AB /(a (?x)b c)d e/ a bcd e *** Failers a b cd e abcd e a bcde /(a b(?x)c d (?-x)e f)/ a bcde f *** Failers abcdef /(a(?i)b)c/ abc aBc *** Failers abC aBC Abc ABc ABC AbC /a(?i:b)c/ abc aBc *** Failers ABC abC aBC /a(?i:b)*c/ aBc aBBc *** Failers aBC aBBC /a(?=b(?i)c)\w\wd/ abcd abCd *** Failers aBCd abcD /(?s-i:more.*than).*million/i more than million more than MILLION more \n than Million *** Failers MORE THAN MILLION more \n than \n million /(?:(?s-i)more.*than).*million/i more than million more than MILLION more \n than Million *** Failers MORE THAN MILLION more \n than \n million /(?>a(?i)b+)+c/ abc aBbc aBBc *** Failers Abc abAb abbC /(?=a(?i)b)\w\wc/ abc aBc *** Failers Ab abC aBC /(?<=a(?i)b)(\w\w)c/ abxxc aBxxc *** Failers Abxxc ABxxc abxxC /(?:(a)|b)(?(1)A|B)/ aA bB *** Failers aB bA /^(a)?(?(1)a|b)+$/ aa b bb *** Failers ab /^(?(?=abc)\w{3}:|\d\d)$/ abc: 12 *** Failers 123 xyz /^(?(?!abc)\d\d|\w{3}:)$/ abc: 12 *** Failers 123 xyz /(?(?<=foo)bar|cat)/ foobar cat fcat focat *** Failers foocat /(?(?a*)*/ a aa aaaa /(abc|)+/ abc abcabc abcabcabc xyz /([a]*)*/ a aaaaa /([ab]*)*/ a b ababab aaaabcde bbbb /([^a]*)*/ b bbbb aaa /([^ab]*)*/ cccc abab /([a]*?)*/ a aaaa /([ab]*?)*/ a b abab baba /([^a]*?)*/ b bbbb aaa /([^ab]*?)*/ c cccc baba /(?>a*)*/ a aaabcde /((?>a*))*/ aaaaa aabbaa /((?>a*?))*/ aaaaa aabbaa /(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x 12-sep-98 12-09-98 *** Failers sep-12-98 /(?<=(foo))bar\1/ foobarfoo foobarfootling *** Failers foobar barfoo /(?i:saturday|sunday)/ saturday sunday Saturday Sunday SATURDAY SUNDAY SunDay /(a(?i)bc|BB)x/ abcx aBCx bbx BBx *** Failers abcX aBCX bbX BBX /^([ab](?i)[cd]|[ef])/ ac aC bD elephant Europe frog France *** Failers Africa /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ ab aBd xy xY zebra Zambesi *** Failers aCD XY /(?<=foo\n)^bar/m foo\nbar *** Failers bar baz\nbar /(?<=(?]&/ <&OUT /^(a\1?){4}$/ aaaaaaaaaa *** Failers AB aaaaaaaaa aaaaaaaaaaa /^(a(?(1)\1)){4}$/ aaaaaaaaaa *** Failers aaaaaaaaa aaaaaaaaaaa /(?:(f)(o)(o)|(b)(a)(r))*/ foobar /(?<=a)b/ ab *** Failers cb b /(?a+)ab/ /(?>a+)b/ aaab /([[:]+)/ a:[b]: /([[=]+)/ a=[b]= /([[.]+)/ a.[b]. /((?>a+)b)/ aaab /(?>(a+))b/ aaab /((?>[^()]+)|\([^()]*\))+/ ((abc(ade)ufh()()x /a\Z/ *** Failers aaab a\nb\n /b\Z/ a\nb\n /b\z/ /b\Z/ a\nb /b\z/ a\nb *** Failers /^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ a abc a-b 0-9 a.b 5.6.7 the.quick.brown.fox a100.b200.300c 12-ab.1245 ***Failers \ .a -a a- a. a_b a.- a.. ab..bc the.quick.brown.fox- the.quick.brown.fox. the.quick.brown.fox_ the.quick.brown.fox+ /(?>.*)(?<=(abcd|wxyz))/ alphabetabcd endingwxyz *** Failers a rather long string that doesn't end with one of them /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ word cat dog elephant mussel cow horse canary baboon snake shark otherword *** Failers word cat dog elephant mussel cow horse canary baboon snake shark /word (?>[a-zA-Z0-9]+ ){0,30}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope otherword *** Failers word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope one too many otherword /(?<=\d{3}(?!999))foo/ 999foo 123999foo *** Failers 123abcfoo /(?<=(?!...999)\d{3})foo/ 999foo 123999foo *** Failers 123abcfoo /(?<=\d{3}(?!999)...)foo/ 123abcfoo 123456foo *** Failers 123999foo /(?<=\d{3}...)(?\s*)=(?>\s*) # find Z)+|A)*/ ZABCDEFG /((?>)+|A)*/ ZABCDEFG /a*/g abbab /^[a-\d]/ abcde -things 0digit *** Failers bcdef /^[\d-a]/ abcde -things 0digit *** Failers bcdef /a*(a{2}b)/ aaaab / End of testinput3 / sed-3.62/testsuite/pcre3p.good0000644000076600007660000011312510143133572013255 00000000000000/(?.*/)foo" /this/is/a/very/long/line/indeed/with/very/many/slashes/in/it/and/foo 0: /this/is/a/very/long/line/indeed/with/very/many/slashes/in/it/and/foo *** Failers No match: POSIX code 17: match failed /this/is/a/very/long/line/indeed/with/foo/in/the/wrong/place No match: POSIX code 17: match failed /(?>(\.\d\d[1-9]?))\d+/ 1.230003938 0: .230003938 1: .23 1.875000282 0: .875000282 1: .875 *** Failers No match: POSIX code 17: match failed 1.235 No match: POSIX code 17: match failed /^((?>\w+)|(?>\s+))*$/ now is the time for all good men to come to the aid of the party 0: now is the time for all good men to come to the aid of the party 1: party *** Failers No match: POSIX code 17: match failed this is not a line with only words and spaces! No match: POSIX code 17: match failed /(\d+)(\w)/ 12345a 0: 12345a 1: 12345 2: a 12345+ 0: 12345 1: 1234 2: 5 /((?>\d+))(\w)/ 12345a 0: 12345a 1: 12345 2: a *** Failers No match: POSIX code 17: match failed 12345+ No match: POSIX code 17: match failed /(?>a+)b/ aaab 0: aaab /((?>a+)b)/ aaab 0: aaab 1: aaab /(?>(a+))b/ aaab 0: aaab 1: aaa /(?>b)+/ aaabbbccc 0: bbb /(?>a+|b+|c+)*c/ aaabbbbccccd 0: aaabbbbc /((?>[^()]+)|\([^()]*\))+/ ((abc(ade)ufh()()x 0: abc(ade)ufh()()x 1: x /\(((?>[^()]+)|\([^()]+\))+\)/ (abc) 0: (abc) 1: abc (abc(def)xyz) 0: (abc(def)xyz) 1: xyz *** Failers No match: POSIX code 17: match failed ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa No match: POSIX code 17: match failed /a(?-i)b/i ab 0: ab *** Failers No match: POSIX code 17: match failed Ab No match: POSIX code 17: match failed aB No match: POSIX code 17: match failed AB No match: POSIX code 17: match failed /(a (?x)b c)d e/ a bcd e 0: a bcd e 1: a bc *** Failers No match: POSIX code 17: match failed a b cd e No match: POSIX code 17: match failed abcd e No match: POSIX code 17: match failed a bcde No match: POSIX code 17: match failed /(a b(?x)c d (?-x)e f)/ a bcde f 0: a bcde f 1: a bcde f *** Failers No match: POSIX code 17: match failed abcdef No match: POSIX code 17: match failed /(a(?i)b)c/ abc 0: abc 1: ab aBc 0: aBc 1: aB *** Failers No match: POSIX code 17: match failed abC No match: POSIX code 17: match failed aBC No match: POSIX code 17: match failed Abc No match: POSIX code 17: match failed ABc No match: POSIX code 17: match failed ABC No match: POSIX code 17: match failed AbC No match: POSIX code 17: match failed /a(?i:b)c/ abc 0: abc aBc 0: aBc *** Failers No match: POSIX code 17: match failed ABC No match: POSIX code 17: match failed abC No match: POSIX code 17: match failed aBC No match: POSIX code 17: match failed /a(?i:b)*c/ aBc 0: aBc aBBc 0: aBBc *** Failers No match: POSIX code 17: match failed aBC No match: POSIX code 17: match failed aBBC No match: POSIX code 17: match failed /a(?=b(?i)c)\w\wd/ abcd 0: abcd abCd 0: abCd *** Failers No match: POSIX code 17: match failed aBCd No match: POSIX code 17: match failed abcD No match: POSIX code 17: match failed /(?s-i:more.*than).*million/i more than million 0: more than million more than MILLION 0: more than MILLION more \n than Million 0: more \x0a than Million *** Failers No match: POSIX code 17: match failed MORE THAN MILLION No match: POSIX code 17: match failed more \n than \n million No match: POSIX code 17: match failed /(?:(?s-i)more.*than).*million/i more than million 0: more than million more than MILLION 0: more than MILLION more \n than Million 0: more \x0a than Million *** Failers No match: POSIX code 17: match failed MORE THAN MILLION No match: POSIX code 17: match failed more \n than \n million No match: POSIX code 17: match failed /(?>a(?i)b+)+c/ abc 0: abc aBbc 0: aBbc aBBc 0: aBBc *** Failers No match: POSIX code 17: match failed Abc No match: POSIX code 17: match failed abAb No match: POSIX code 17: match failed abbC No match: POSIX code 17: match failed /(?=a(?i)b)\w\wc/ abc 0: abc aBc 0: aBc *** Failers No match: POSIX code 17: match failed Ab No match: POSIX code 17: match failed abC No match: POSIX code 17: match failed aBC No match: POSIX code 17: match failed /(?<=a(?i)b)(\w\w)c/ abxxc 0: xxc 1: xx aBxxc 0: xxc 1: xx *** Failers No match: POSIX code 17: match failed Abxxc No match: POSIX code 17: match failed ABxxc No match: POSIX code 17: match failed abxxC No match: POSIX code 17: match failed /(?:(a)|b)(?(1)A|B)/ aA 0: aA 1: a bB 0: bB *** Failers No match: POSIX code 17: match failed aB No match: POSIX code 17: match failed bA No match: POSIX code 17: match failed /^(a)?(?(1)a|b)+$/ aa 0: aa 1: a b 0: b bb 0: bb *** Failers No match: POSIX code 17: match failed ab No match: POSIX code 17: match failed /^(?(?=abc)\w{3}:|\d\d)$/ abc: 0: abc: 12 0: 12 *** Failers No match: POSIX code 17: match failed 123 No match: POSIX code 17: match failed xyz No match: POSIX code 17: match failed /^(?(?!abc)\d\d|\w{3}:)$/ abc: 0: abc: 12 0: 12 *** Failers No match: POSIX code 17: match failed 123 No match: POSIX code 17: match failed xyz No match: POSIX code 17: match failed /(?(?<=foo)bar|cat)/ foobar 0: bar cat 0: cat fcat 0: cat focat 0: cat *** Failers No match: POSIX code 17: match failed foocat No match: POSIX code 17: match failed /(?(?a*)*/ a 0: a aa 0: aa aaaa 0: aaaa /(abc|)+/ abc 0: abc 1: abcabc 0: abcabc 1: abcabcabc 0: abcabcabc 1: xyz 0: 1: /([a]*)*/ a 0: a 1: aaaaa 0: aaaaa 1: /([ab]*)*/ a 0: a 1: b 0: b 1: ababab 0: ababab 1: aaaabcde 0: aaaab 1: bbbb 0: bbbb 1: /([^a]*)*/ b 0: b 1: bbbb 0: bbbb 1: aaa 0: 1: /([^ab]*)*/ cccc 0: cccc 1: abab 0: 1: /([a]*?)*/ a 0: 1: aaaa 0: 1: /([ab]*?)*/ a 0: 1: b 0: 1: abab 0: 1: baba 0: 1: /([^a]*?)*/ b 0: 1: bbbb 0: 1: aaa 0: 1: /([^ab]*?)*/ c 0: 1: cccc 0: 1: baba 0: 1: /(?>a*)*/ a 0: a aaabcde 0: aaa /((?>a*))*/ aaaaa 0: aaaaa 1: aabbaa 0: aa 1: /((?>a*?))*/ aaaaa 0: 1: aabbaa 0: 1: /(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x 12-sep-98 0: 12-sep-98 12-09-98 0: 12-09-98 *** Failers No match: POSIX code 17: match failed sep-12-98 No match: POSIX code 17: match failed /(?<=(foo))bar\1/ foobarfoo 0: barfoo 1: foo foobarfootling 0: barfoo 1: foo *** Failers No match: POSIX code 17: match failed foobar No match: POSIX code 17: match failed barfoo No match: POSIX code 17: match failed /(?i:saturday|sunday)/ saturday 0: saturday sunday 0: sunday Saturday 0: Saturday Sunday 0: Sunday SATURDAY 0: SATURDAY SUNDAY 0: SUNDAY SunDay 0: SunDay /(a(?i)bc|BB)x/ abcx 0: abcx 1: abc aBCx 0: aBCx 1: aBC bbx 0: bbx 1: bb BBx 0: BBx 1: BB *** Failers No match: POSIX code 17: match failed abcX No match: POSIX code 17: match failed aBCX No match: POSIX code 17: match failed bbX No match: POSIX code 17: match failed BBX No match: POSIX code 17: match failed /^([ab](?i)[cd]|[ef])/ ac 0: ac 1: ac aC 0: aC 1: aC bD 0: bD 1: bD elephant 0: e 1: e Europe 0: E 1: E frog 0: f 1: f France 0: F 1: F *** Failers No match: POSIX code 17: match failed Africa No match: POSIX code 17: match failed /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ ab 0: ab 1: ab aBd 0: aBd 1: aBd xy 0: xy 1: xy xY 0: xY 1: xY zebra 0: z 1: z Zambesi 0: Z 1: Z *** Failers No match: POSIX code 17: match failed aCD No match: POSIX code 17: match failed XY No match: POSIX code 17: match failed /(?<=foo\n)^bar/m foo\nbar 0: bar *** Failers No match: POSIX code 17: match failed bar No match: POSIX code 17: match failed baz\nbar No match: POSIX code 17: match failed /(?<=(?]&/ <&OUT 0: <& /^(a\1?){4}$/ aaaaaaaaaa 0: aaaaaaaaaa 1: aaaa *** Failers No match: POSIX code 17: match failed AB No match: POSIX code 17: match failed aaaaaaaaa No match: POSIX code 17: match failed aaaaaaaaaaa No match: POSIX code 17: match failed /^(a(?(1)\1)){4}$/ aaaaaaaaaa 0: aaaaaaaaaa 1: aaaa *** Failers No match: POSIX code 17: match failed aaaaaaaaa No match: POSIX code 17: match failed aaaaaaaaaaa No match: POSIX code 17: match failed /(?:(f)(o)(o)|(b)(a)(r))*/ foobar 0: foobar 1: f 2: o 3: o 4: b 5: a 6: r /(?<=a)b/ ab 0: b *** Failers No match: POSIX code 17: match failed cb No match: POSIX code 17: match failed b No match: POSIX code 17: match failed /(?a+)ab/ /(?>a+)b/ aaab 0: aaab /([[:]+)/ a:[b]: 0: :[ 1: :[ /([[=]+)/ a=[b]= 0: =[ 1: =[ /([[.]+)/ a.[b]. 0: .[ 1: .[ /((?>a+)b)/ aaab 0: aaab 1: aaab /(?>(a+))b/ aaab 0: aaab 1: aaa /((?>[^()]+)|\([^()]*\))+/ ((abc(ade)ufh()()x 0: abc(ade)ufh()()x 1: x /a\Z/ *** Failers No match: POSIX code 17: match failed aaab No match: POSIX code 17: match failed a\nb\n No match: POSIX code 17: match failed /b\Z/ a\nb\n 0: b /b\z/ /b\Z/ a\nb 0: b /b\z/ a\nb 0: b *** Failers No match: POSIX code 17: match failed /^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ a 0: a 1: abc 0: abc 1: a-b 0: a-b 1: 0-9 0: 0-9 1: a.b 0: a.b 1: 5.6.7 0: 5.6.7 1: the.quick.brown.fox 0: the.quick.brown.fox 1: a100.b200.300c 0: a100.b200.300c 1: 12-ab.1245 0: 12-ab.1245 1: ***Failers No match: POSIX code 17: match failed \ No match: POSIX code 17: match failed .a No match: POSIX code 17: match failed -a No match: POSIX code 17: match failed a- No match: POSIX code 17: match failed a. No match: POSIX code 17: match failed a_b No match: POSIX code 17: match failed a.- No match: POSIX code 17: match failed a.. No match: POSIX code 17: match failed ab..bc No match: POSIX code 17: match failed the.quick.brown.fox- No match: POSIX code 17: match failed the.quick.brown.fox. No match: POSIX code 17: match failed the.quick.brown.fox_ No match: POSIX code 17: match failed the.quick.brown.fox+ No match: POSIX code 17: match failed /(?>.*)(?<=(abcd|wxyz))/ alphabetabcd 0: alphabetabcd 1: abcd endingwxyz 0: endingwxyz 1: wxyz *** Failers No match: POSIX code 17: match failed a rather long string that doesn't end with one of them No match: POSIX code 17: match failed /word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ word cat dog elephant mussel cow horse canary baboon snake shark otherword 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword *** Failers No match: POSIX code 17: match failed word cat dog elephant mussel cow horse canary baboon snake shark No match: POSIX code 17: match failed /word (?>[a-zA-Z0-9]+ ){0,30}otherword/ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope otherword 0: word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope otherword *** Failers No match: POSIX code 17: match failed word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope No match: POSIX code 17: match failed word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope one too many otherword No match: POSIX code 17: match failed /(?<=\d{3}(?!999))foo/ 999foo 0: foo 123999foo 0: foo *** Failers No match: POSIX code 17: match failed 123abcfoo No match: POSIX code 17: match failed /(?<=(?!...999)\d{3})foo/ 999foo 0: foo 123999foo 0: foo *** Failers No match: POSIX code 17: match failed 123abcfoo No match: POSIX code 17: match failed /(?<=\d{3}(?!999)...)foo/ 123abcfoo 0: foo 123456foo 0: foo *** Failers No match: POSIX code 17: match failed 123999foo No match: POSIX code 17: match failed /(?<=\d{3}...)(?\s*)=(?>\s*) # find Z)+|A)*/ ZABCDEFG 0: ZA 1: A /((?>)+|A)*/ ZABCDEFG 0: 1: /a*/g abbab 0: a /^[a-\d]/ abcde 0: a -things 0: - 0digit 0: 0 *** Failers No match: POSIX code 17: match failed bcdef No match: POSIX code 17: match failed /^[\d-a]/ abcde 0: a -things 0: - 0digit 0: 0 *** Failers No match: POSIX code 17: match failed bcdef No match: POSIX code 17: match failed /a*(a{2}b)/ aaaab 0: aaaab 1: aab / End of testinput3 / sed-3.62/testsuite/pcretest.c0000644000076600007660000005630010143133572013205 00000000000000/************************************************* * PCRE testing program * *************************************************/ #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif /* Use the internal info for displaying the results of pcre_study(). */ #include "config.h" #include "pcre.h" #include "internal.h" /* It is possible to compile this test program without including support for testing the POSIX interface, though this is not available via the standard Makefile. */ #include "regexp.h" #ifndef CLOCKS_PER_SEC #ifdef CLK_TCK #define CLOCKS_PER_SEC CLK_TCK #else #define CLOCKS_PER_SEC 100 #endif #endif #define LOOPREPEAT 20000 #include "getopt.h" static int log_store = 0; static size_t gotten_store; static FILE *infile, *outfile; /* Character string printing function. */ static void pchars (unsigned char *p, int length) { int c; while (length-- > 0) { if (isprint (c = *(p++))) fprintf (outfile, "%c", c); else fprintf (outfile, "\\x%02x", c); } } /* Alternative malloc function, to test functionality and show the size of the compiled re. */ static void * new_malloc (size_t size) { gotten_store = size; if (log_store) fprintf (outfile, "Memory allocation (code space): %d\n", (int) ((int) size - offsetof (pcre, code[0]))); return malloc (size); } /* Get one piece of information from the pcre_info() function */ static void new_info (pcre * re, pcre_extra * study, int option, void *ptr) { int rc; if ((rc = pcre_info (re, study, option, ptr)) < 0) fprintf (outfile, "Error %d from pcre_fullinfo(%d)\n", rc, option); } /* Read lines from named file or stdin and write to named file or stdout; lines consist of a regular expression, in delimiters and optionally followed by options, followed by a set of test data, terminated by an empty line. */ int main (int argc, char **argv) { int options = 0; int study_options = 0; int timeit = 0; int showinfo = 0; int showstore = 0; int size_offsets = 45; int size_offsets_max; int *offsets; int posix = 0; int perl = 1; int study = 0; int debug = 0; int done = 0; unsigned char buffer[30000]; unsigned char dbuffer[1024]; char *endptr; /* Scan options */ #define SHORTOPTS "dimo:pPSst" for (;;) { static struct option longopts[] = { {"debug", 0, NULL, 'd'}, {"showinfo", 0, NULL, 'i'}, {"offsets-size", 0, NULL, 'o'}, {"regexec", 0, NULL, 'p'}, {"posix", 0, NULL, 'P'}, {"study", 0, NULL, 'S'}, {"showstore", 0, NULL, 's'}, {"time", 0, NULL, 't'}, {NULL, 0, NULL, 0} }; char c = getopt_long (argc, argv, SHORTOPTS, longopts, NULL); /* Detect the end of the options. */ if (c == -1) break; switch (c) { case 's': case 'm': showstore = 1; break; case 't': timeit = 1; break; case 'i': showinfo = 1; break; case 'd': showinfo = debug = 1; break; case 'p': posix = 1; break; case 'P': perl = 0; break; case 'S': study = 1; break; case 'o': if ((size_offsets = strtoul (optarg, &endptr, 10)) && *endptr == 0) break; default: printf ("Usage: pcretest [options...] [ []]\n"); printf (" -d --debug debug: show compiled code; implies -i\n"); printf (" -i --showinfo show information about compiled pattern\n"); printf (" -o N --offsets-size=N set size of offsets vector to \n"); printf (" -p --regexec use POSIX interface\n"); printf (" -P --posix use POSIX regular expressions\n"); printf (" -S --study study regular expressions\n"); printf (" -s --showstore output store information\n"); printf (" -t --time time compilation and execution\n"); return 1; } } /* Sort out the input and output files */ if (optind < argc && strcmp (argv[optind], "-") != 0) { infile = fopen (argv[optind], "r"); if (infile == NULL) { fprintf (stderr, "** Failed to open %s\n", argv[optind]); return 1; } } else infile = stdin; if (++optind < argc && strcmp (argv[optind], "-") != 0) { outfile = fopen (argv[optind], "w"); if (outfile == NULL) { fprintf (stderr, "** Failed to open %s\n", argv[optind]); return 1; } } else outfile = stdout; /* Get the store for the offsets vector, and remember what it was */ size_offsets_max = size_offsets; offsets = malloc (size_offsets_max * sizeof (int)); if (offsets == NULL) { fprintf (stderr, "** Failed to get %d bytes of memory for offsets vector\n", size_offsets_max * sizeof (int)); return 1; } /* Set alternative malloc function */ pcre_malloc = new_malloc; /* Main loop */ while (!done) { pcre *re = NULL; pcre_extra *extra = NULL; regex_t preg; const char *error; unsigned char *p, *pp, *ppp; const unsigned char *tables = NULL; int do_posix = posix; int do_study = study; int do_debug = debug; int do_showinfo = showinfo; int do_G = 0; int do_g = 0; int do_showrest = 0; int erroroffset, len, delimiter; #ifdef HAVE_ISATTY if (isatty (fileno (infile))) fprintf (outfile, " re> "); #endif if (fgets ((char *) buffer, sizeof (buffer), infile) == NULL) break; #ifdef HAVE_ISATTY if (!isatty (fileno (infile)) || !isatty (fileno (outfile))) #endif fprintf (outfile, "%s", (char *) buffer); p = buffer; while (isspace (*p)) p++; if (*p == 0 || *p == '#') continue; /* Get the delimiter and seek the end of the pattern; if is isn't complete, read more. */ delimiter = *p++; if (isalnum (delimiter) || delimiter == '\\') { fprintf (stderr, "** Delimiter must not be alphameric or \\\n"); goto SKIP_DATA; } pp = p; for (;;) { while (*pp != 0) { if (*pp == '\\' && pp[1] != 0) pp++; else if (*pp == delimiter) break; pp++; } if (*pp != 0) break; len = sizeof (buffer) - (pp - buffer); if (len < 256) { fprintf (stderr, "** Expression too long - missing delimiter?\n"); goto SKIP_DATA; } #ifdef HAVE_ISATTY if (isatty(fileno(infile))) fprintf (outfile, " > "); #endif if (fgets ((char *) pp, len, infile) == NULL) { fprintf (stderr, "** Unexpected EOF\n"); done = 1; goto CONTINUE; } #ifdef HAVE_ISATTY if (!isatty (fileno (infile)) || !isatty (fileno (outfile))) #endif fprintf (outfile, "%s", (char *) pp); } /* If the first character after the delimiter is backslash, make the pattern end with backslash. This is purely to provide a way of testing for the error message when a pattern ends with backslash. */ if (pp[1] == '\\') *pp++ = '\\'; /* Terminate the pattern at the delimiter */ *pp++ = 0; /* Look for options after final delimiter */ options = 0; study_options = 0; log_store = showstore; /* default from command line */ while (*pp != 0) { switch (*pp++) { case 'g': do_g = 1; break; case 'i': options |= PCRE_CASELESS; break; case 'm': options |= PCRE_MULTILINE; break; case 's': options |= PCRE_DOTALL; break; case 'x': options |= PCRE_EXTENDED; break; case '+': do_showrest = 1; break; case 'A': options |= PCRE_ANCHORED; break; case 'D': do_debug = do_showinfo = 1; break; case 'E': options |= PCRE_DOLLAR_ENDONLY; break; case 'G': do_G = 1; break; case 'I': do_showinfo = 1; break; case 'M': log_store = 1; break; case 'P': do_posix = 1; break; case 'S': do_study = 1; break; case 'U': options |= PCRE_UNGREEDY; break; case 'X': options |= PCRE_EXTRA; break; case 'L': ppp = pp; while (*ppp != '\n' && *ppp != ' ') ppp++; *ppp = 0; if (setlocale (LC_CTYPE, (const char *) pp) == NULL) { fprintf (stderr, "** Failed to set locale \"%s\"\n", pp); goto SKIP_DATA; } tables = pcre_maketables (); pp = ppp; break; case '\n': case ' ': break; default: fprintf (stderr, "** Unknown option '%c'\n", pp[-1]); goto SKIP_DATA; } } /* Handle compiling via the POSIX interface, which doesn't support the timing, showing, or debugging options, nor the ability to pass over local character tables. */ if (do_posix) { int rc; int cflags = 0; if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE; if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE; if ((options & PCRE_DOTALL) != 0) cflags |= REG_DOTALL; if ((options & PCRE_EXTENDED) != 0) cflags |= REG_EXTENDED; rc = regcomp (&preg, (char *) p, perl ? cflags | REG_PERL : cflags); /* Compilation failed; go back for another re, skipping to blank line if non-interactive. */ if (rc != 0) { (void) regerror (rc, &preg, (char *) buffer, sizeof (buffer)); fprintf (outfile, "Failed: POSIX code %d: %s\n", rc, buffer); goto SKIP_DATA; } } /* Handle compiling via the native interface */ else { if (timeit) { register int i; clock_t time_taken; clock_t start_time = clock (); for (i = 0; i < LOOPREPEAT; i++) { re = perl ? pcre_compile ((char *) p, options, &error, &erroroffset, tables) : pcre_posix_compile ((char *) p, options, &error, &erroroffset, tables); if (re != NULL) free (re); } time_taken = clock () - start_time; fprintf (outfile, "Compile time %.3f milliseconds\n", ((double) time_taken * 1000.0) / ((double) LOOPREPEAT * (double) CLOCKS_PER_SEC)); } re = perl ? pcre_compile ((char *) p, options, &error, &erroroffset, tables) : pcre_posix_compile ((char *) p, options, &error, &erroroffset, tables); /* Compilation failed; go back for another re, skipping to blank line if non-interactive. */ if (re == NULL) { fprintf (outfile, "Failed: %s at offset %d\n", error, erroroffset); SKIP_DATA: #ifdef HAVE_ISATTY if (!isatty (fileno (infile))) #endif { for (;;) { if (fgets ((char *) buffer, sizeof (buffer), infile) == NULL) { done = 1; goto CONTINUE; } len = (int) strlen ((char *) buffer); while (len > 0 && isspace (buffer[len - 1])) len--; if (len == 0) break; } fprintf (outfile, "\n"); } goto CONTINUE; } /* If /S was present, study the regexp to generate additional info to help with the matching. */ if (do_study) { if (timeit) { register int i; clock_t time_taken; clock_t start_time = clock (); for (i = 0; i < LOOPREPEAT; i++) extra = pcre_study (re, study_options, &error); time_taken = clock () - start_time; if (extra != NULL) free (extra); fprintf (outfile, " Study time %.3f milliseconds\n", ((double) time_taken * 1000.0) / ((double) LOOPREPEAT * (double) CLOCKS_PER_SEC)); } extra = pcre_study (re, study_options, &error); if (error != NULL) fprintf (outfile, "Failed to study: %s\n", error); else if (extra == NULL) fprintf (outfile, "Study returned NULL\n"); else if (do_showinfo) { uschar *start_bits = NULL; new_info (re, extra, PCRE_INFO_FIRSTTABLE, &start_bits); if (start_bits == NULL) fprintf (outfile, "No starting character set\n"); else { int i; int c = 24; fprintf (outfile, "Starting character set: "); for (i = 0; i < 256; i++) { if ((start_bits[i / 8] & (1 << (i % 8))) != 0) { if (c > 75) { fprintf (outfile, "\n "); c = 2; } if (isprint (i) && i != ' ') { fprintf (outfile, "%c ", i); c += 2; } else { fprintf (outfile, "\\x%02x ", i); c += 5; } } } fprintf (outfile, "\n"); } } } /* Compilation succeeded; print data if required. There are now two info-returning functions. The old one has a limited interface and returns only limited data. Check that it agrees with the newer one. */ if (do_showinfo) { unsigned long int get_options; int old_first_char, old_options, old_count; int count, backrefmax, first_char, need_char; size_t size; if (do_debug) pcre_debug (re); new_info (re, NULL, PCRE_INFO_OPTIONS, &get_options); new_info (re, NULL, PCRE_INFO_SIZE, &size); new_info (re, NULL, PCRE_INFO_CAPTURECOUNT, &count); new_info (re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax); new_info (re, NULL, PCRE_INFO_FIRSTCHAR, &first_char); new_info (re, NULL, PCRE_INFO_LASTLITERAL, &need_char); if (count < 0) fprintf (outfile, "Error %d from pcre_info()\n", count); if (size != gotten_store) fprintf (outfile, "Size disagreement: pcre_fullinfo=%d call to malloc for %d\n", size, gotten_store); fprintf (outfile, "Capturing subpattern count = %d\n", count); if (backrefmax > 0) fprintf (outfile, "Max back reference = %d\n", backrefmax); if (get_options == 0) fprintf (outfile, "No options\n"); else fprintf (outfile, "Options:%s%s%s%s%s%s%s%s\n", ((get_options & PCRE_ANCHORED) != 0) ? " anchored" : "", ((get_options & PCRE_CASELESS) != 0) ? " caseless" : "", ((get_options & PCRE_EXTENDED) != 0) ? " extended" : "", ((get_options & PCRE_MULTILINE) != 0) ? " multiline" : "", ((get_options & PCRE_DOTALL) != 0) ? " dotall" : "", ((get_options & PCRE_DOLLAR_ENDONLY) != 0) ? " dollar_endonly" : "", ((get_options & PCRE_EXTRA) != 0) ? " extra" : "", ((get_options & PCRE_UNGREEDY) != 0) ? " ungreedy" : ""); if (((re->options) & PCRE_ICHANGED) != 0) fprintf (outfile, "Case state changes\n"); } } /* Read data lines and test them */ for (;;) { unsigned char *q; unsigned char *bptr = dbuffer; int *use_offsets = offsets; int use_size_offsets = size_offsets; int count, c; int copystrings = 0; int getstrings = 0; int getlist = 0; int gmatched = 0; int start_offset = 0; int g_notempty = 0; options = 0; #ifdef HAVE_ISATTY if (isatty (fileno (infile))) fprintf (outfile, "data> "); #endif if (fgets ((char *) buffer, sizeof (buffer), infile) == NULL) { done = 1; goto CONTINUE; } #ifdef HAVE_ISATTY if (!isatty (fileno (infile)) || !isatty (fileno (outfile))) #endif fprintf (outfile, "%s", (char *) buffer); len = (int) strlen ((char *) buffer); while (len > 0 && isspace (buffer[len - 1])) len--; buffer[len] = 0; if (len == 0) break; p = buffer; while (isspace (*p)) p++; q = dbuffer; while ((c = *p++) != 0) { int i = 0; int n = 0; if (c == '\\') switch ((c = *p++)) { case 'a': c = 7; break; case 'b': c = '\b'; break; case 'e': c = 27; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': c -= '0'; while (i++ < 2 && isdigit (*p) && *p != '8' && *p != '9') c = c * 8 + *p++ - '0'; break; case 'x': c = 0; while (i++ < 2 && isxdigit (*p)) { c = c * 16 + tolower (*p) - ((isdigit (*p)) ? '0' : 'W'); p++; } break; case 0: /* Allows for an empty line */ p--; continue; case 'A': /* Option setting */ options |= PCRE_ANCHORED; continue; case 'B': options |= PCRE_NOTBOL; continue; case 'C': while (isdigit (*p)) n = n * 10 + *p++ - '0'; copystrings |= 1 << n; continue; case 'G': while (isdigit (*p)) n = n * 10 + *p++ - '0'; getstrings |= 1 << n; continue; case 'L': getlist = 1; continue; case 'N': options |= PCRE_NOTEMPTY; continue; case 'O': while (isdigit (*p)) n = n * 10 + *p++ - '0'; if (n > size_offsets_max) { size_offsets_max = n; free (offsets); use_offsets = offsets = malloc (size_offsets_max * sizeof (int)); if (offsets == NULL) { printf ("** Failed to get %d bytes of memory for offsets vector\n", size_offsets_max * sizeof (int)); return 1; } } use_size_offsets = n; if (n == 0) use_offsets = NULL; continue; case 'Z': options |= PCRE_NOTEOL; continue; } *q++ = c; } *q = 0; len = q - dbuffer; /* Handle matching via the POSIX interface, which does not support timing. */ if (do_posix) { int rc; int eflags = 0; regmatch_t *pmatch = malloc (sizeof (regmatch_t) * use_size_offsets); if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL; if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL; rc = regnexec (&preg, (const char *) bptr, len, use_size_offsets, pmatch, eflags); if (rc != 0) { (void) regerror (rc, &preg, (char *) buffer, sizeof (buffer)); fprintf (outfile, "No match: POSIX code %d: %s\n", rc, buffer); } else { size_t i; for (i = 0; i < use_size_offsets; i++) { if (pmatch[i].rm_so == -1) continue; fprintf (outfile, "%2d: ", (int) i); pchars (dbuffer + pmatch[i].rm_so, pmatch[i].rm_eo - pmatch[i].rm_so); fprintf (outfile, "\n"); if (i == 0 && do_showrest) { fprintf (outfile, " 0+ "); pchars (dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo); fprintf (outfile, "\n"); } } } free (pmatch); } /* Handle matching via the native interface - repeats for /g and /G */ else for (;; gmatched++) /* Loop for /g or /G */ { fflush(outfile); if (timeit) { register int i; clock_t time_taken; clock_t start_time = clock (); for (i = 0; i < LOOPREPEAT; i++) count = pcre_exec (re, extra, (char *) bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets); time_taken = clock () - start_time; fprintf (outfile, "Execute time %.3f milliseconds\n", ((double) time_taken * 1000.0) / ((double) LOOPREPEAT * (double) CLOCKS_PER_SEC)); } count = pcre_exec (re, extra, (char *) bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets); if (count == 0) { fprintf (outfile, "Matched, but too many substrings\n"); count = use_size_offsets / 3; } /* Matched */ if (count >= 0) { int i; for (i = 0; i < count * 2; i += 2) { if (use_offsets[i] < 0) fprintf (outfile, "%2d: \n", i / 2); else { fprintf (outfile, "%2d: ", i / 2); pchars (bptr + use_offsets[i], use_offsets[i + 1] - use_offsets[i]); fprintf (outfile, "\n"); if (i == 0) { if (do_showrest) { fprintf (outfile, " 0+ "); pchars (bptr + use_offsets[i + 1], len - use_offsets[i + 1]); fprintf (outfile, "\n"); } } } } for (i = 0; i < 32; i++) { if ((copystrings & (1 << i)) != 0) { char copybuffer[16]; int rc = pcre_copy_substring ((char *) bptr, use_offsets, count, i, copybuffer, sizeof (copybuffer)); if (rc < 0) fprintf (outfile, "copy substring %d failed %d\n", i, rc); else fprintf (outfile, "%2dC %s (%d)\n", i, copybuffer, rc); } } for (i = 0; i < 32; i++) { if ((getstrings & (1 << i)) != 0) { const char *substring; int rc = pcre_get_substring ((char *) bptr, use_offsets, count, i, &substring); if (rc < 0) fprintf (outfile, "get substring %d failed %d\n", i, rc); else { fprintf (outfile, "%2dG %s (%d)\n", i, substring, rc); /* free((void *)substring); */ pcre_free_substring (substring); } } } if (getlist) { const char **stringlist; int rc = pcre_get_substring_list ((char *) bptr, use_offsets, count, &stringlist); if (rc < 0) fprintf (outfile, "get substring list failed %d\n", rc); else { for (i = 0; i < count; i++) fprintf (outfile, "%2dL %s\n", i, stringlist[i]); if (stringlist[i] != NULL) fprintf (outfile, "string list not terminated by NULL\n"); /* free((void *)stringlist); */ pcre_free_substring_list (stringlist); } } } /* Failed to match. If this is a /g or /G loop and we previously set g_notempty after a null match, this is not necessarily the end. We want to advance the start offset, and continue. Fudge the offset values to achieve this. We won't be at the end of the string - that was checked before setting g_notempty. */ else { if (g_notempty != 0) { use_offsets[0] = start_offset; use_offsets[1] = start_offset + 1; } else { if (gmatched == 0) /* Error if no previous matches */ { if (count == -1) fprintf (outfile, "No match\n"); else fprintf (outfile, "Error %d\n", count); } break; /* Out of the /g loop */ } } /* If not /g or /G we are done */ if (!do_g && !do_G) break; /* If we have matched an empty string, first check to see if we are at the end of the subject. If so, the /g loop is over. Otherwise, mimic what Perl's /g options does. This turns out to be rather cunning. First we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the same point. If this fails (picked up above) we advance to the next character. */ g_notempty = 0; if (use_offsets[0] == use_offsets[1]) { if (use_offsets[0] == len) break; g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED; } /* For /g, update the start offset, leaving the rest alone */ if (do_g) start_offset = use_offsets[1]; /* For /G, update the pointer and length */ else { bptr += use_offsets[1]; len -= use_offsets[1]; } } /* End of loop for /g and /G */ } /* End of loop for data lines */ CONTINUE: if (do_posix) regfree (&preg); if (re != NULL) free (re); if (extra != NULL) free (extra); if (tables != NULL) { free ((void *) tables); setlocale (LC_CTYPE, "C"); } } fprintf (outfile, "\n"); return 0; } /* End */ sed-3.62/testsuite/readin.good0000644000076600007660000000070110202627247013321 00000000000000``Democracy will not come today, this year, nor ever through compromise and fear. MOO I have as much right as the other fellow has to stand on my two feet and own the land. MOO I tire so of hearing people say let things take their course, tomorrow is another day. MOO I do not need my freedom when I'm dead. MOO I cannot live on tomorrow's bread. MOO Freedom is a strong seed planted in a great need. MOO I live here, too. MOO sed-3.62/testsuite/readin.in20000644000076600007660000000000410163553230013051 00000000000000MOO sed-3.62/testsuite/readin.inp0000644000076600007660000000075610143133572013166 00000000000000``Democracy will not come today, this year, nor ever through compromise and fear. I have as much right as the other fellow has to stand on my two feet and own the land. I tire so of hearing people say let things take their course, tomorrow is another day. I do not need my freedom when I'm dead. I cannot live on tomorrow's bread. Freedom is a strong seed planted in a great need. I live here, too. I want freedom just as you.'' ``The Weary Blues'', Langston Hughes sed-3.62/testsuite/readin.sed0000644000076600007660000000003410202627247013143 00000000000000/\.$/r readin.in2 /too\.$/q sed-3.62/testsuite/recall.good0000644000076600007660000000006110143133572013315 00000000000000eeefff Xeefff XYefff XYeYff XYeYYf XYeYYY XYeYYY sed-3.62/testsuite/recall.inp0000644000076600007660000000000710143133572013153 00000000000000eeefff sed-3.62/testsuite/recall.sed0000644000076600007660000000017210143133572013143 00000000000000# Check that the empty regex recalls the last *executed* regex, # not the last *compiled* regex p s/e/X/p :x s//Y/p /f/bx sed-3.62/testsuite/recall2.good0000644000076600007660000000001710163557763013416 00000000000000>abb<||>abbbb< sed-3.62/testsuite/recall2.inp0000644000076600007660000000002110163557763013247 00000000000000ababb||abbbabbbb sed-3.62/testsuite/recall2.sed0000644000076600007660000000040610163557763013243 00000000000000# Starting from sed 4.1.3, regexes are compiled with REG_NOSUB # if they are used in an address, so that the matcher does not # have to obey leftmost-longest. The tricky part is to recompile # them if they are then used in a substitution. /\(ab*\)\+/ s//>\1 tmp.test 2>&1; then rm -f tmp.test else exitcode=$? cat tmp.test rm -f tmp.test exit $exitcode fi sed-3.62/testsuite/sep.good0000644000076600007660000000001010143133572012634 00000000000000 /// // sed-3.62/testsuite/sep.inp0000644000076600007660000000027310143133572012505 00000000000000miss mary mack mack//mack/ran down/the track track track slashes\aren't%used enough/in/casual-conversation/// possibly sentences would be more attractive if they ended in two slashes// sed-3.62/testsuite/sep.sed0000644000076600007660000000014710143133572012472 00000000000000# inspired by an autoconf generated configure script. s%/[^/][^/]*$%% s%[\/][^\/][^\/]*$%% s,.*[^\/],, sed-3.62/testsuite/space.good0000644000076600007660000000004410143133572013147 00000000000000Hello_World_! SecondXXine__of_tests sed-3.62/testsuite/space.inp0000644000076600007660000000004410143133572013005 00000000000000Hello World ! Second_line_ of tests sed-3.62/testsuite/space.sed0000644000076600007660000000002410143133572012770 00000000000000s/_\S/XX/g;s/\s/_/g sed-3.62/testsuite/subwrite.inp0000644000076600007660000000021210143133572013553 00000000000000Not some church, and not the state, Not some dark capricious fate. Who you are, and when you lose, Comes only from the things you choose. sed-3.62/testsuite/subwrite.sed0000644000076600007660000000003210143133572013540 00000000000000s/you/YoU/w subwrite.wout sed-3.62/testsuite/subwrt1.good0000644000076600007660000000021210143133572013460 00000000000000Not some church, and not the state, Not some dark capricious fate. Who YoU are, and when you lose, Comes only from the things YoU choose. sed-3.62/testsuite/subwrt2.good0000644000076600007660000000010710143133572013464 00000000000000Who YoU are, and when you lose, Comes only from the things YoU choose. sed-3.62/testsuite/uniq.good0000644000076600007660000011004610143133572013034 00000000000000 #define DPRINTF(p) /*nothing */ #define DPRINTF(p) printf p #define GETCHAR(c, eptr) c = *eptr; #define GETCHARINC(c, eptr) c = *eptr++; #define class pcre_class #define match_condassert 0x01 /* Called to check a condition assertion */ #define match_isgroup 0x02 /* Set if start of bracketed group */ #else #endif #ifdef DEBUG /* Sigh. Some compilers never learn. */ #ifdef DEBUG #ifdef __cplusplus #include "internal.h" && length - re->max_match_size > start_offset) ((*ecode++ == OP_BEG_WORD) ? prev_is_word : cur_is_word)) ((md->ctypes[*eptr] & ctype_word) != 0); ((md->ctypes[eptr[-1]] & ctype_word) != 0); (eptr == md->end_subject - 1 && *eptr != '\n')) (i.e. keep it out of the loop). Also we can test that there are at least (md->ctypes[*eptr++] & ctype_digit) != 0) (md->ctypes[*eptr++] & ctype_digit) == 0) (md->ctypes[*eptr++] & ctype_space) != 0) (md->ctypes[*eptr++] & ctype_space) == 0) (md->ctypes[*eptr++] & ctype_word) != 0) (md->ctypes[*eptr++] & ctype_word) == 0) (offsetcount - 2) * sizeof (int)); (offsets == NULL && offsetcount > 0)) (pcre_free) (match_block.offset_vector); (pcre_free) (save); (re->tables + fcc_offset)[req_char] : req_char; * Match a back-reference * * Execute a Regular Expression * * Match from current position * * Debugging function to print chars * * Perl-Compatible Regular Expressions * * Macros and tables for character handling * *************************************************/ */ *iptr = -1; *iptr++ = -1; *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT || *prev == OP_ONCE) ----------------------------------------------------------------------------- -1 => failed to match /* /* "Once" brackets are like assertion brackets except that after a match, /* ... else fall through */ /* Advance to a possible match for an initial string after study */ /* Allow compilation as C++ source code, should anybody want to do that. */ /* Always fail if not enough characters left */ /* An alternation is the end of a branch; scan along to find the end of the /* Assert before internal newline if multiline, or before a terminating /* Assertion brackets. Check the alternative branches in turn - the /* At the start of a bracketed group, add the current subject pointer to the /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating /* Caseful comparisons */ /* Change option settings */ /* Common code for all repeated single character type matches */ /* Common code for all repeated single-character matches. We can give /* Compute the minimum number of offsets that we need to reset each time. Doing /* Conditional group: compilation checked that there are no more than /* Continue as from after the assertion, updating the offsets high water /* Continue from after the assertion, updating the offsets high water /* Control never gets here */ /* Control never reaches here */ /* Copy the offset information from temporary store if necessary */ /* Do a single test if no case difference is set up */ /* Do not stick any code in here without much thought; it is assumed /* End of a group, repeated or non-repeating. If we are at the end of /* End of subject assertion (\z) */ /* End of subject or ending \n assertion (\Z) */ /* End of the pattern. If PCRE_NOTEMPTY is set, fail if we have matched /* First, ensure the minimum number of matches are present. */ /* First, ensure the minimum number of matches are present. Use inline /* First, ensure the minimum number of matches are present. We get back /* Flag bits for the match() function */ /* For a non-repeating ket, just continue at this level. This also /* For anchored or unanchored matches, there may be a "last known required /* For extended extraction brackets (large number), we have to fish out /* For extended extraction brackets (large number), we have to fish out the /* For matches anchored to the end of the pattern, we can often avoid /* If a back reference hasn't been set, the length that is passed is greater /* If checking an assertion for a condition, return TRUE. */ /* If hit the end of the group (which could be repeated), fail */ /* If max == min we can continue with the main loop without the /* If maximizing it is worth using inline code for speed, doing the type /* If maximizing, find the longest possible run, then work backwards. */ /* If maximizing, find the longest string and work backwards */ /* If min = max, continue at the same level without recursing */ /* If min = max, continue at the same level without recursion. /* If minimizing, keep testing the rest of the expression and advancing /* If minimizing, keep trying and advancing the pointer */ /* If minimizing, we have to test the rest of the pattern before each /* If req_char is set, we know that that character must appear in the subject /* If the expression has got more back references than the offsets supplied can /* If the length of the reference is zero, just continue with the /* If the reference is unset, set the length to be longer than the amount /* If we can't find the required character, break the matching loop */ /* If we have found the required character, save the point where we /* In all other cases except a conditional group we have to check the /* In case the recursion has set more capturing values, save the final /* Include the internals header, which itself includes Standard C headers plus /* Insufficient room for saving captured contents */ /* Loop for handling unanchored repeated matching attempts; for anchored regexs /* Match a back reference, possibly repeatedly. Look past the end of the /* Match a character class, possibly repeatedly. Look past the end of the /* Match a negated single character */ /* Match a negated single character repeatedly. This is almost a repeat of /* Match a run of characters */ /* Match a single character repeatedly; different opcodes share code. */ /* Match a single character type repeatedly; several different opcodes /* Match a single character type; inline for speed */ /* Min and max values for the common repeats; for the maxima, 0 => infinity */ /* Move the subject pointer back. This occurs only at the start of /* Negative assertion: all branches must fail to match */ /* Now start processing the operations. */ /* OP_KETRMAX */ /* On entry ecode points to the first opcode, and eptr to the first character /* Opening capturing bracket. If there is space in the offset vector, save /* Or to a non-unique first char after study */ /* Or to a unique first char if possible */ /* Or to just after \n for a multiline match if possible */ /* Other types of node can be handled by a switch */ /* Otherwise test for either case */ /* Print a sequence of chars in printable format, stopping at the end of the /* Recursion matches the current regex, nested. If there are any capturing /* Reset the maximum number of extractions we might see. */ /* Reset the value of the ims flags, in case they got changed during /* Reset the working variable associated with each extraction. These should /* Separate the caselesss case for speed */ /* Set up for repetition, or handle the non-repeated case */ /* Set up the first character to match, if available. The first_char value is /* Skip over conditional reference data or large extraction number data if /* Start of subject assertion */ /* Start of subject unless notbol, or after internal newline if multiline */ /* Structure for building a chain of data that actually lives on the /* The code is duplicated for the caseless and caseful cases, for speed, /* The condition is an assertion. Call match() to evaluate it - setting /* The ims options can vary during the matching as a result of the presence /* The repeating kets try the rest of the pattern or restart from the /* There's been some horrible disaster. */ /* This "while" is the end of the "do" above */ /* This function applies a compiled re to a subject string and picks out /* Use a macro for debugging printing, 'cause that limits the use of #ifdef /* We don't need to repeat the search if we haven't yet reached the /* When a match occurs, substrings will be set for all internal extractions; /* Word boundary assertions */ /************************************************* 1. This software is distributed in the hope that it will be useful, 2. The origin of this software must not be misrepresented, either by 3. Altered versions must be plainly marked as such, and must not be 4. If PCRE is embedded in any software that is released under the GNU 5.005. If there is an options reset, it will get obeyed in the normal 6 : 3 + (ecode[1] << 8) + ecode[2]), < -1 => some kind of unexpected problem = 0 => success, but offsets is not big enough Arguments: BOOL anchored; BOOL cur_is_word = (eptr < md->end_subject) && BOOL is_subject; BOOL minimize = FALSE; BOOL prev_is_word = (eptr != md->start_subject) && BOOL rc; BOOL startline; BOOL using_temporary_offsets = FALSE; Copyright (c) 1997-2000 University of Cambridge DPRINTF ((">>>> returning %d\n", match_block.errorcode)); DPRINTF ((">>>> returning %d\n", rc)); DPRINTF (("Copied offsets from temporary memory\n")); DPRINTF (("Freeing temporary memory\n")); DPRINTF (("Got memory to hold back references\n")); DPRINTF (("Unknown opcode %d\n", *ecode)); DPRINTF (("bracket %d failed\n", number)); DPRINTF (("bracket 0 failed\n")); DPRINTF (("ims reset to %02lx\n", ims)); DPRINTF (("ims set to %02lx at group repeat\n", ims)); DPRINTF (("ims set to %02lx\n", ims)); DPRINTF (("matching %c{%d,%d} against subject %.*s\n", c, min, max, DPRINTF (("negative matching %c{%d,%d} against subject %.*s\n", c, min, max, DPRINTF (("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); DPRINTF (("start bracket 0\n")); GETCHAR (c, eptr) /* Get character */ GETCHARINC (c, eptr) /* Get character; increment eptr */ General Purpose Licence (GPL), then the terms of that licence shall However, if the referenced string is the empty string, always treat If the bracket fails to match, we need to restore this value and also the If there isn't enough space in the offset vector, treat this as if it were a MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Otherwise, we can use the vector supplied, rounding down its size to a multiple Permission is granted to anyone to use this software for any purpose on any REPEATCHAR: REPEATNOTCHAR: REPEATTYPE: Returns: > 0 => success; value is the number of elements filled in Returns: TRUE if matched Returns: TRUE if matched Returns: nothing They are not both allowed to be zero. */ This is a library of functions to support regular expressions whose syntax This is the forcible breaking of infinite loops as implemented in Perl Writing separate code makes it go faster, as does using an autoincrement and Written by: Philip Hazel a move back into the brackets. Check the alternative branches in turn - the address of eptr, so that eptr can be a register variable. */ an assertion "group", stop matching and return TRUE, but record the an empty string - recursion will then try other alternatives, if any. */ an error. Save the top 15 values on the stack, and accept that the rest an unanchored pattern, of course. If there's no first char and the pattern was analyzing most of the pattern. length > re->max_match_size is anchored = ((re->options | options) & PCRE_ANCHORED) != 0; and advance one byte in the pattern code. */ and reinstate them after the recursion. However, we don't know how many and semantics are as close as possible to those of the Perl 5 language. See and the required character in fact is caseful. */ at run time, so we have to test for anchoring. The first char may be unset for avoid duplicate testing (which takes significant time). This covers the vast backing off on a match. */ bmtable = extra->data.bmtable; both cases of the character. Otherwise set the two values the same, which will bracketed group and go to there. */ brackets - for testing for empty matches brackets started but not finished, we have to save their starting points break; but WITHOUT ANY WARRANTY; without even the implied warranty of c != md->lcc[*eptr++]) c = *ecode++ - OP_CRSTAR; c = *ecode++ - OP_NOTSTAR; c = *ecode++ - OP_STAR; c = *ecode++ - OP_TYPESTAR; c = *ecode++; c = *eptr++; c = 15; c = max - min; c = md->end_subject - eptr; c = md->lcc[c]; c = md->offset_max; c == md->lcc[*eptr++]) can't just fail here, because of the possibility of quantifiers with zero case OP_ALT: case OP_ANY: case OP_ASSERT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ASSERT_NOT: case OP_BEG_WORD: case OP_BRA: /* Non-capturing bracket: optimized */ case OP_BRAMINZERO: case OP_BRANUMBER: case OP_BRAZERO: case OP_CHARS: case OP_CIRC: case OP_CLASS: case OP_COND: case OP_CREF: case OP_CRMINPLUS: case OP_CRMINQUERY: case OP_CRMINRANGE: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRQUERY: case OP_CRRANGE: case OP_CRSTAR: case OP_DIGIT: case OP_DOLL: case OP_END: case OP_END_WORD: case OP_EOD: case OP_EODN: case OP_EXACT: case OP_KET: case OP_KETRMAX: case OP_KETRMIN: case OP_MINPLUS: case OP_MINQUERY: case OP_MINSTAR: case OP_MINUPTO: case OP_NOT: case OP_NOTEXACT: case OP_NOTMINPLUS: case OP_NOTMINQUERY: case OP_NOTMINSTAR: case OP_NOTMINUPTO: case OP_NOTPLUS: case OP_NOTQUERY: case OP_NOTSTAR: case OP_NOTUPTO: case OP_NOT_DIGIT: case OP_NOT_WHITESPACE: case OP_NOT_WORDCHAR: case OP_NOT_WORD_BOUNDARY: case OP_ONCE: case OP_OPT: case OP_PLUS: case OP_QUERY: case OP_RECURSE: case OP_REF: case OP_REVERSE: case OP_SOD: case OP_STAR: case OP_TYPEEXACT: case OP_TYPEMINPLUS: case OP_TYPEMINQUERY: case OP_TYPEMINSTAR: case OP_TYPEMINUPTO: case OP_TYPEPLUS: case OP_TYPEQUERY: case OP_TYPESTAR: case OP_TYPEUPTO: case OP_UPTO: case OP_WHITESPACE: case OP_WORDCHAR: case OP_WORD_BOUNDARY: case matching may be when this character is hit, so test for it in both its caselessly, or if there are any changes of this flag within the regex, set up cases if necessary. However, the different cased versions will not be set up character" set. If the PCRE_CASELESS is set, implying that the match starts characters and work backwards. */ code for maximizing the speed, and do the type test once at the start code to character type repeats - written out again for speed. */ commoning these up that doesn't require a test of the positive/negative computer system, and to redistribute it freely, subject to the following const char *subject; const pcre *re; const pcre_extra *extra; const uschar *bmtable = NULL; const uschar *data = ecode + 1; /* Save for matching */ const uschar *end_subject; const uschar *next = ecode + 1; const uschar *p = md->start_subject + md->offset_vector[offset]; const uschar *p; const uschar *pp = eptr; const uschar *prev = ecode - (ecode[1] << 8) - ecode[2]; const uschar *prev = ecode; const uschar *req_char_ptr = start_match - 1; const uschar *saved_eptr = eptr; const uschar *saved_eptr = eptrb->saved_eptr; const uschar *saved_eptr; const uschar *start_bits = NULL; const uschar *start_match = (const uschar *) subject + start_offset; continue; /* With the main loop */ continue; course of events. */ ctype = *ecode++; /* Code for the character type */ cur_is_word == prev_is_word : cur_is_word != prev_is_word) current high water mark for use by positive assertions. Do this also default: /* No repeat follows */ default: do each branch of a lookbehind assertion. If we are too close to the start to each substring: the offsets to the start and end of the substring. ecode position in code ecode + ((offset < offset_top && md->offset_vector[offset] >= 0) ? ecode += (ecode[1] << 8) + ecode[2]; ecode += 2; ecode += 3 + (ecode[4] << 8) + ecode[5]; ecode += 33; /* Advance past the item */ ecode += 3; /* Advance past the item */ ecode += 3; ecode += 5; ecode = next + 3; ecode++; else else if ((extra->options & PCRE_STUDY_BM) != 0) else if (first_char >= 0) else if (start_bits != NULL) else if (startline) encountered */ end_subject = match_block.end_subject; eptr pointer in subject eptr points into the subject eptr += c; eptr += length; eptr += min; eptr -= (ecode[1] << 8) + ecode[2]; eptr -= length; eptr = md->end_match_ptr; eptr++; eptrb pointer to chain of blocks containing eptr at start of eptrb = &newptrb; eptrb = eptrb->prev; /* Back up the stack of bracket start pointers */ eptrblock *eptrb; eptrblock newptrb; eptrblock; exactly what going to the ket would do. */ explicit claim or by omission. external_extra points to "hints" from pcre_study() or is NULL external_re points to the compiled expression extraction by setting the offsets and bumping the high water mark. */ first_char = match_block.lcc[first_char]; first_char = re->first_char; flags can contain for (;;) for (i = 1; i <= c; i++) for (i = 1; i <= min; i++) for (i = min; i < max; i++) for (i = min;; i++) for the "once" (not-backup up) groups. */ for the match to succeed. If the first character is set, req_char must be found it, so that we don't search again next time round the loop if from a previous iteration of this group, and be referred to by a reference goto REPEATCHAR; goto REPEATNOTCHAR; goto REPEATTYPE; group number back at the start and if necessary complete handling an happens for a repeating ket if no characters were matched in the group. here; that is handled in the code for KET. */ hold, we get a temporary bit of working store to use during the matching. i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper if (!anchored) if (!match (start_match, re->code, 2, &match_block, ims, NULL, match_isgroup)) if (!match_ref (offset, eptr, length, md, ims)) if (!md->endonly) if (!rc) if (!startline && extra != NULL) if ((*ecode++ == OP_WORD_BOUNDARY) ? if ((data[c / 8] & (1 << (c & 7))) != 0) if ((data[c / 8] & (1 << (c & 7))) == 0) if ((extra->options & PCRE_STUDY_MAPPED) != 0) if ((flags & match_condassert) != 0) if ((flags & match_isgroup) != 0) if ((ims & PCRE_CASELESS) != 0) if ((ims & PCRE_DOTALL) == 0 && c == '\n') if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == '\n') if ((ims & PCRE_DOTALL) == 0) if ((ims & PCRE_MULTILINE) != 0) if ((md->ctypes[*eptr++] & ctype_digit) != 0) if ((md->ctypes[*eptr++] & ctype_digit) == 0) if ((md->ctypes[*eptr++] & ctype_space) != 0) if ((md->ctypes[*eptr++] & ctype_space) == 0) if ((md->ctypes[*eptr++] & ctype_word) != 0) if ((md->ctypes[*eptr++] & ctype_word) == 0) if ((md->ctypes[c] & ctype_digit) != 0) if ((md->ctypes[c] & ctype_digit) == 0) if ((md->ctypes[c] & ctype_space) != 0) if ((md->ctypes[c] & ctype_space) == 0) if ((md->ctypes[c] & ctype_word) != 0) if ((md->ctypes[c] & ctype_word) == 0) if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) if ((re->options & PCRE_FIRSTSET) != 0) if ((re->options & PCRE_REQCHSET) != 0) if ((start_bits[c / 8] & (1 << (c & 7))) == 0) if (*ecode != OP_ONCE && *ecode != OP_ALT) if (*ecode == OP_KET || eptr == saved_eptr) if (*ecode == OP_KET) if (*ecode == OP_KETRMIN) if (*ecode++ != *eptr++) if (*ecode++ == *eptr++) if (*eptr != '\n') if (*eptr++ == '\n') if (*p++ != *eptr++) if (*p++ == req_char) if (*prev != OP_COND) if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT || if (bmtable != NULL) if (bmtable[*start_match]) if (c != *eptr++) if (c != md->lcc[*eptr++]) if (c < 16) if (c == *eptr++) if (c == md->lcc[*eptr++]) if (c > md->end_subject - eptr) if (cur_is_word == prev_is_word || if (ecode[3] == OP_CREF) /* Condition is extraction test */ if (ecode[3] == OP_OPT) if (eptr != md->start_subject && eptr[-1] != '\n') if (eptr != md->start_subject) if (eptr < md->end_subject - 1 || if (eptr < md->end_subject) if (eptr < md->start_subject) if (eptr >= md->end_subject || if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0) if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0) if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0) if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0) if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0) if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0) if (eptr >= md->end_subject || *eptr == '\n') if (eptr >= md->end_subject || c != *eptr) if (eptr >= md->end_subject || c != md->lcc[*eptr]) if (eptr >= md->end_subject || c == *eptr) if (eptr >= md->end_subject || c == md->lcc[*eptr]) if (eptr >= md->end_subject) if (eptr++ >= md->end_subject) if (i >= max || !match_ref (offset, eptr, length, md, ims)) if (i >= max || eptr >= md->end_subject || if (i >= max || eptr >= md->end_subject || c != *eptr++) if (i >= max || eptr >= md->end_subject || c == *eptr++) if (i >= max || eptr >= md->end_subject) if (is_subject && length > md->end_subject - p) if (isprint (c = *(p++))) if (length == 0) if (length > md->end_subject - eptr) if (match (eptr, ecode + 3, offset_top, md, ims, NULL, if (match (eptr, ecode + 3, offset_top, md, ims, NULL, match_isgroup)) if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, 0) || if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, match_isgroup)) if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr, next + 3, offset_top, md, ims, eptrb, match_isgroup)) if (match (eptr, next, offset_top, md, ims, eptrb, match_isgroup)) if (match (eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) if (match_block.end_offset_top > offsetcount) if (match_block.offset_vector != NULL) if (match_block.offset_vector == NULL) if (max == 0) if (md->lcc[*ecode++] != md->lcc[*eptr++]) if (md->lcc[*ecode++] == md->lcc[*eptr++]) if (md->lcc[*p++] != md->lcc[*eptr++]) if (md->notbol && eptr == md->start_subject) if (md->notempty && eptr == md->start_match) if (md->noteol) if (min == max) if (min > 0) if (min > md->end_subject - eptr) if (minimize) if (number > 0) if (number > EXTRACT_BASIC_MAX) if (offset < md->offset_max) if (offset >= md->offset_max) if (offset_top <= offset) if (offsetcount < 2) if (offsetcount >= 4) if (op > OP_BRA) if (p > req_char_ptr) if (p >= end_subject) if (pp == req_char || pp == req_char2) if (re == NULL || subject == NULL || if (re->magic_number != MAGIC_NUMBER) if (re->max_match_size >= 0 if (re->top_backref > 0 && re->top_backref >= ocount / 3) if (req_char == req_char2) if (req_char >= 0) if (resetcount > offsetcount) if (save != stacksave) if (save == NULL) if (skipped_chars) if (start_match + bmtable[256] > end_subject) if (start_match > match_block.start_subject + start_offset) if (using_temporary_offsets) if certain parts of the pattern were not used. */ if the malloc fails ... there is no way of returning to the top level with implied in the second condition, because start_offset > 0. */ ims current /i, /m, and /s options ims the ims flags ims = (ims & ~PCRE_IMS) | ecode[4]; ims = ecode[1]; ims = original_ims; ims = re->options & (PCRE_CASELESS | PCRE_MULTILINE | PCRE_DOTALL); in the pattern. */ in the subject string, while eptrb holds the value of eptr at the start of the initialize them to avoid reading uninitialized locations. */ inline, and there are *still* stupid compilers about that don't like indented inside the group. int int *offsets; int *save; int c; int first_char = -1; int flags; int length; int min, max, ctype; int number = *prev - OP_BRA; int number = op - OP_BRA; int offset = (ecode[1] << 9) | (ecode[2] << 1); /* Doubled reference number */ int offset = (ecode[4] << 9) | (ecode[5] << 1); /* Doubled reference number */ int offset; int offset_top; int offsetcount; int op = (int) *ecode; int options; int rc; int req_char = -1; int req_char2 = -1; int resetcount, ocount; int save_offset1 = md->offset_vector[offset]; int save_offset2 = md->offset_vector[offset + 1]; int save_offset3 = md->offset_vector[md->offset_end - number]; int skipped_chars = 0; int stacksave[15]; int start_offset; is a bit large to put on the stack, but using malloc for small numbers is_subject TRUE if printing from within md->start_subject it as matched, any number of times (otherwise there could be infinite item to see if there is repeat information following. The code is similar item to see if there is repeat information following. Then obey similar last bracketed group - used for breaking infinite loops matching zero-length later in the subject; otherwise the test starts at the match point. This length length of subject string (may contain binary zeros) length length to be matched length number to print length = (offset >= offset_top || md->offset_vector[offset] < 0) ? length = md->end_subject - p; level without recursing. Otherwise, if minimizing, keep trying the rest of loop. */ loops). */ main loop. */ majority of cases. It will be suboptimal when the case flag changes in a regex mark, since extracts may have been taken during the assertion. */ mark, since extracts may have been taken. */ match (eptr, ecode + 3, offset_top, md, ims, eptrb, 0)) match (eptr, ecode, offset_top, md, ims, eptrb, flags) match (eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) match_block.ctypes = re->tables + ctypes_offset; match_block.end_subject = match_block.start_subject + length; match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; match_block.errorcode = PCRE_ERROR_NOMATCH; /* Default error */ match_block.errorcode == PCRE_ERROR_NOMATCH && match_block.lcc = re->tables + lcc_offset; match_block.lcc[*start_match] != first_char) match_block.notbol = (options & PCRE_NOTBOL) != 0; match_block.notempty = (options & PCRE_NOTEMPTY) != 0; match_block.noteol = (options & PCRE_NOTEOL) != 0; match_block.offset_end = ocount; match_block.offset_max = (2 * ocount) / 3; match_block.offset_overflow = FALSE; match_block.offset_overflow = TRUE; match_block.offset_vector = (int *) (pcre_malloc) (ocount * sizeof (int)); match_block.offset_vector = offsets; match_block.start_match = start_match; match_block.start_pattern = re->code; match_block.start_subject = (const uschar *) subject; match_condassert - this is an assertion condition match_condassert | match_isgroup)) match_data *md; match_data match_block; match_isgroup - this is the start of a bracketed group match_isgroup); match_ref (offset, eptr, length, md, ims) matches, we carry on as at the end of a normal bracket, leaving the subject matching won't pass the KET for an assertion. If any one branch matches, matching won't pass the KET for this kind of subpattern. If any one branch max = (ecode[1] << 8) + ecode[2]; max = (ecode[3] << 8) + ecode[4]; max = INT_MAX; max = rep_max[c]; /* zero for max => infinity */ max, eptr)); maximum. Alternatively, if maximizing, find the maximum number of may be wrong. */ md pointer to "static" info for the match md pointer to matching data block, if is_subject is TRUE md points to match data block md->end_match_ptr = eptr; /* For ONCE */ md->end_match_ptr = eptr; /* Record where we ended */ md->end_offset_top = offset_top; /* and how many extracts were taken */ md->end_offset_top = offset_top; md->end_subject - eptr + 1 : md->errorcode = PCRE_ERROR_UNKNOWN_NODE; md->offset_overflow = TRUE; md->offset_vector[md->offset_end - i] = save[i]; md->offset_vector[md->offset_end - number] = eptr - md->start_subject; md->offset_vector[md->offset_end - number] = save_offset3; md->offset_vector[md->offset_end - number]; md->offset_vector[offset + 1] - md->offset_vector[offset]; md->offset_vector[offset + 1] = eptr - md->start_subject; md->offset_vector[offset + 1] = save_offset2; md->offset_vector[offset] = md->offset_vector[offset] = save_offset1; memcpy (offsets + 2, match_block.offset_vector + 2, min = (ecode[1] << 8) + ecode[2]; min = 0; min = max = (ecode[1] << 8) + ecode[2]; min = max = 1; min = rep_min[c]; /* Pick up values from tables; */ minima. */ minimize = (*ecode == OP_CRMINRANGE); minimize = (c & 1) != 0; minimize = *ecode == OP_MINUPTO; minimize = *ecode == OP_NOTMINUPTO; minimize = *ecode == OP_TYPEMINUPTO; minimize = TRUE; minimum number of matches are present. If min = max, continue at the same misrepresented as being the original software. move back, this match function fails. */ mustn't change the current values of the data slot, because they may be set need to recurse. */ never be used unless previously set, but they get saved and restored, and so we never set for an anchored regular expression, but the anchoring may be forced newline unless endonly is set, else end of subject unless noteol is set. */ newptrb.prev = eptrb; newptrb.saved_eptr = eptr; next += (next[1] << 8) + next[2]; non-capturing bracket. Don't worry about setting the flag for the error case number = (ecode[4] << 8) | ecode[5]; number = (prev[4] << 8) | prev[5]; number from a dummy opcode at the start. */ number, then move along the subject till after the recursive match, ocount = offsetcount - (offsetcount % 3); ocount = re->top_backref * 3 + 3; of (?ims) items in the pattern. They are kept in a local variable so that of 3. */ of subject left; this ensures that every attempt at a match fails. We offset index into the offset vector offset = number << 1; offset_top current top pointer offset_top = md->end_offset_top; offset_top = offset + 2; offset_top, md, ims, eptrb, match_isgroup); offsetcount the number of elements in the vector offsets points to a vector of ints to be filled in with offsets offsets[0] = start_match - match_block.start_subject; offsets[1] = match_block.end_match_ptr - match_block.start_subject; op = OP_BRA; opcode. */ optimization can save a huge amount of backtracking in patterns with nested option for each character match. Maybe that wouldn't add very much to the options option bits p points to characters p--; past the end if there is only one branch, but that's OK because that is pchars (ecode, length, FALSE, md); pchars (eptr, 16, TRUE, md); pchars (eptr, length, TRUE, md); pchars (p, length, FALSE, md); pchars (p, length, is_subject, md) pchars (start_match, end_subject - start_match, TRUE, &match_block); pcre_exec (re, extra, subject, length, start_offset, options, offsets, offsetcount) place we found it at last time. */ pointer. */ portions of the string if it matches. Two elements in the vector are set for pre-processor statements. I suppose it's only been 10 years... */ preceded by BRAZERO or BRAMINZERO. */ preceding bracket, in the appropriate order. */ preceding bracket, in the appropriate order. We need to reset any options printf (" against backref "); printf (" against pattern "); printf ("%c", c); printf (">>>> Match against: "); printf (">>>>> Skipped %d chars to reach first character\n", printf ("\\x%02x", c); printf ("\n"); printf ("end bracket %d", number); printf ("matching subject "); printf ("matching subject against pattern "); printf ("matching subject "); printf ("start bracket %d subject=", number); rc = 0; rc = match (eptr, md->start_pattern, offset_top, md, ims, eptrb, rc = match_block.offset_overflow ? 0 : match_block.end_offset_top / 2; register const uschar *ecode; register const uschar *eptr; register const uschar *p = start_match + ((first_char >= 0) ? 1 : 0); register int *iend = iptr + resetcount; register int *iend = iptr - resetcount / 2 + 1; register int *iptr = match_block.offset_vector + ocount; register int *iptr = match_block.offset_vector; register int c = *start_match; register int c; register int i; register int length = ecode[1]; register int pp = *p++; repeat it in the interests of efficiency. */ repeat limits are compiled as a number of copies, with the optional ones req_char = re->req_char; req_char2 = ((re->options & (PCRE_CASELESS | PCRE_ICHANGED)) != 0) ? req_char_ptr = p; resetcount = 2 + re->top_bracket * 2; resetcount = ocount; restoring at the exit of a group is easy. */ restrictions: return FALSE; return PCRE_ERROR_BADMAGIC; return PCRE_ERROR_BADOPTION; return PCRE_ERROR_NOMATCH; return PCRE_ERROR_NOMEMORY; return PCRE_ERROR_NULL; return TRUE; return match (eptr, return match (eptr, ecode + 3, offset_top, md, ims, eptrb, match_isgroup); return match_block.errorcode; return rc; save = (int *) (pcre_malloc) ((c + 1) * sizeof (int)); save = stacksave; save[i] = md->offset_vector[md->offset_end - i]; seems expensive. As a compromise, the stack is used when there are fewer share code. This is very similar to the code for single characters, but we similar code to character type repeats - written out again for speed. since matching characters is likely to be quite common. First, ensure the skipped_chars += bmtable[*start_match], skipped_chars += bmtable[256] - 1; skipped_chars -= bmtable[256] - 1; skipped_chars); skipped_chars++, stack of such pointers, to be re-instated at the end of the group when we hit stack, for holding the values of the subject pointer at the start of each start of each branch to move the current point backwards, so the code at start_bits = extra->data.start_bits; start_match += bmtable[*start_match]; start_match += bmtable[256] - 1; start_match -= bmtable[256] - 1; start_match = (const uschar *) subject + length - re->max_match_size; start_match++ < end_subject); start_match++; start_offset where to start in the subject string startline = (re->options & PCRE_STARTLINE) != 0; static BOOL static const char rep_max[] = static const char rep_min[] = static void strings. struct eptrblock *prev; studied, there may be a bitmap of possible first characters. */ subject points to the subject string subject if the requested. subpattern - to break infinite loops. */ subpattern, so as to detect when an empty string has been matched by a subsequent match. */ such there are (offset_top records the completed total) so we just have supersede any condition above with which it is incompatible. switch (*ecode) switch (ctype) switch (op) test once at the start (i.e. keep it out of the loop). */ than 16 values to store; otherwise malloc is used. A problem is what to do than the number of characters left in the string, so the match fails. that "continue" in the code above comes out to here to repeat the main that changed within the bracket before re-running it, so check the next that it may occur zero times. It may repeat infinitely, or not at all - the assertion is true. Lookbehind assertions have an OP_REVERSE item at the the closing ket. When match() is called in other circumstances, we don't add to the code for a repeated single character, but I haven't found a nice way of the current subject position in the working slot at the top of the vector. We the expression and advancing one matching character if failing, up to the the external pcre header. */ the file Tech.Notes for some information on the internals. the final argument TRUE causes it to stop at the end of an assertion. */ the group. */ the length of the reference string explicitly rather than passing the the loop runs just once. */ the minimum number of bytes before we start. */ the number from a dummy opcode at the start. */ the point in the subject string is not moved back. Thus there can never be the pointer while it matches the class. */ the same bracket. the stack. */ the start hasn't passed this character yet. */ the subject. */ there were too many extractions, set the return code to zero. In the case this level is identical to the lookahead case. */ this makes a huge difference to execution time when there aren't many brackets those back references that we can. In this case there need not be overflow time taken, but character matching *is* what this is all about... */ to save all the potential data. There may be up to 99 such values, which to that for character classes, but repeated for efficiency. Then obey two branches. If the condition is false, skipping the first branch takes us typedef struct eptrblock unless PCRE_CASELESS was given or the casing state changes within the regex. unlimited repeats that aren't going to match. We don't know what the state of unsigned long int ims = 0; unsigned long int ims; unsigned long int original_ims = ims; /* Save for resetting on ')' */ up quickly if there are fewer than the minimum number of characters left in using_temporary_offsets = TRUE; values of the final offsets, in case they were set by a previous iteration of we just need to set up the whole thing as substring 0 before returning. If where we had to get some local store to hold offsets for backreferences, copy while (!anchored && while (*ecode == OP_ALT) while (*ecode == OP_ALT); while (*next == OP_ALT); while (--iptr >= iend) while (eptr >= pp) while (iptr < iend) while (length-- > 0) while (p < end_subject) while (start_match < end_subject && while (start_match < end_subject && *start_match != first_char) while (start_match < end_subject && start_match[-1] != '\n') while (start_match < end_subject) { {0, 0, 0, 0, 1, 1}; {0, 0, 1, 1, 0, 0}; } /* End of main loop */ } sed-3.62/testsuite/uniq.inp0000644000076600007660000014103010143133572012667 00000000000000 #define DPRINTF(p) /*nothing */ #define DPRINTF(p) printf p #define GETCHAR(c, eptr) c = *eptr; #define GETCHARINC(c, eptr) c = *eptr++; #define class pcre_class #define match_condassert 0x01 /* Called to check a condition assertion */ #define match_isgroup 0x02 /* Set if start of bracketed group */ #else #endif #endif #endif #endif #endif #endif #endif #endif #endif #endif #endif #endif #endif #endif #endif #endif #ifdef DEBUG /* Sigh. Some compilers never learn. */ #ifdef DEBUG /* Sigh. Some compilers never learn. */ #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef DEBUG #ifdef __cplusplus #include "internal.h" && length - re->max_match_size > start_offset) ((*ecode++ == OP_BEG_WORD) ? prev_is_word : cur_is_word)) ((md->ctypes[*eptr] & ctype_word) != 0); ((md->ctypes[*eptr] & ctype_word) != 0); ((md->ctypes[eptr[-1]] & ctype_word) != 0); ((md->ctypes[eptr[-1]] & ctype_word) != 0); (eptr == md->end_subject - 1 && *eptr != '\n')) (eptr == md->end_subject - 1 && *eptr != '\n')) (i.e. keep it out of the loop). Also we can test that there are at least (md->ctypes[*eptr++] & ctype_digit) != 0) (md->ctypes[*eptr++] & ctype_digit) == 0) (md->ctypes[*eptr++] & ctype_space) != 0) (md->ctypes[*eptr++] & ctype_space) == 0) (md->ctypes[*eptr++] & ctype_word) != 0) (md->ctypes[*eptr++] & ctype_word) == 0) (offsetcount - 2) * sizeof (int)); (offsets == NULL && offsetcount > 0)) (pcre_free) (match_block.offset_vector); (pcre_free) (match_block.offset_vector); (pcre_free) (save); (re->tables + fcc_offset)[req_char] : req_char; * Match a back-reference * * Execute a Regular Expression * * Match from current position * * Debugging function to print chars * * Perl-Compatible Regular Expressions * * Macros and tables for character handling * *************************************************/ *************************************************/ *************************************************/ *************************************************/ *************************************************/ *************************************************/ */ */ */ */ */ *iptr = -1; *iptr++ = -1; *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT || *prev == OP_ONCE) ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -1 => failed to match /* /* "Once" brackets are like assertion brackets except that after a match, /* ... else fall through */ /* ... else fall through */ /* Advance to a possible match for an initial string after study */ /* Allow compilation as C++ source code, should anybody want to do that. */ /* Always fail if not enough characters left */ /* An alternation is the end of a branch; scan along to find the end of the /* Assert before internal newline if multiline, or before a terminating /* Assertion brackets. Check the alternative branches in turn - the /* At the start of a bracketed group, add the current subject pointer to the /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating /* Caseful comparisons */ /* Caseful comparisons */ /* Change option settings */ /* Common code for all repeated single character type matches */ /* Common code for all repeated single-character matches. We can give /* Common code for all repeated single-character matches. We can give /* Compute the minimum number of offsets that we need to reset each time. Doing /* Conditional group: compilation checked that there are no more than /* Continue as from after the assertion, updating the offsets high water /* Continue from after the assertion, updating the offsets high water /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never gets here */ /* Control never reaches here */ /* Control never reaches here */ /* Copy the offset information from temporary store if necessary */ /* Do a single test if no case difference is set up */ /* Do not stick any code in here without much thought; it is assumed /* End of a group, repeated or non-repeating. If we are at the end of /* End of subject assertion (\z) */ /* End of subject or ending \n assertion (\Z) */ /* End of the pattern. If PCRE_NOTEMPTY is set, fail if we have matched /* First, ensure the minimum number of matches are present. */ /* First, ensure the minimum number of matches are present. Use inline /* First, ensure the minimum number of matches are present. We get back /* Flag bits for the match() function */ /* For a non-repeating ket, just continue at this level. This also /* For a non-repeating ket, just continue at this level. This also /* For anchored or unanchored matches, there may be a "last known required /* For extended extraction brackets (large number), we have to fish out /* For extended extraction brackets (large number), we have to fish out the /* For matches anchored to the end of the pattern, we can often avoid /* If a back reference hasn't been set, the length that is passed is greater /* If checking an assertion for a condition, return TRUE. */ /* If hit the end of the group (which could be repeated), fail */ /* If max == min we can continue with the main loop without the /* If maximizing it is worth using inline code for speed, doing the type /* If maximizing, find the longest possible run, then work backwards. */ /* If maximizing, find the longest string and work backwards */ /* If min = max, continue at the same level without recursing */ /* If min = max, continue at the same level without recursion. /* If minimizing, keep testing the rest of the expression and advancing /* If minimizing, keep trying and advancing the pointer */ /* If minimizing, we have to test the rest of the pattern before each /* If req_char is set, we know that that character must appear in the subject /* If the expression has got more back references than the offsets supplied can /* If the length of the reference is zero, just continue with the /* If the reference is unset, set the length to be longer than the amount /* If we can't find the required character, break the matching loop */ /* If we have found the required character, save the point where we /* In all other cases except a conditional group we have to check the /* In case the recursion has set more capturing values, save the final /* Include the internals header, which itself includes Standard C headers plus /* Insufficient room for saving captured contents */ /* Loop for handling unanchored repeated matching attempts; for anchored regexs /* Match a back reference, possibly repeatedly. Look past the end of the /* Match a character class, possibly repeatedly. Look past the end of the /* Match a negated single character */ /* Match a negated single character repeatedly. This is almost a repeat of /* Match a run of characters */ /* Match a single character repeatedly; different opcodes share code. */ /* Match a single character type repeatedly; several different opcodes /* Match a single character type; inline for speed */ /* Min and max values for the common repeats; for the maxima, 0 => infinity */ /* Move the subject pointer back. This occurs only at the start of /* Negative assertion: all branches must fail to match */ /* Now start processing the operations. */ /* OP_KETRMAX */ /* OP_KETRMAX */ /* On entry ecode points to the first opcode, and eptr to the first character /* Opening capturing bracket. If there is space in the offset vector, save /* Or to a non-unique first char after study */ /* Or to a unique first char if possible */ /* Or to just after \n for a multiline match if possible */ /* Other types of node can be handled by a switch */ /* Otherwise test for either case */ /* Print a sequence of chars in printable format, stopping at the end of the /* Recursion matches the current regex, nested. If there are any capturing /* Reset the maximum number of extractions we might see. */ /* Reset the value of the ims flags, in case they got changed during /* Reset the working variable associated with each extraction. These should /* Separate the caselesss case for speed */ /* Set up for repetition, or handle the non-repeated case */ /* Set up the first character to match, if available. The first_char value is /* Skip over conditional reference data or large extraction number data if /* Start of subject assertion */ /* Start of subject unless notbol, or after internal newline if multiline */ /* Structure for building a chain of data that actually lives on the /* The code is duplicated for the caseless and caseful cases, for speed, /* The code is duplicated for the caseless and caseful cases, for speed, /* The condition is an assertion. Call match() to evaluate it - setting /* The ims options can vary during the matching as a result of the presence /* The repeating kets try the rest of the pattern or restart from the /* The repeating kets try the rest of the pattern or restart from the /* There's been some horrible disaster. */ /* This "while" is the end of the "do" above */ /* This function applies a compiled re to a subject string and picks out /* Use a macro for debugging printing, 'cause that limits the use of #ifdef /* We don't need to repeat the search if we haven't yet reached the /* When a match occurs, substrings will be set for all internal extractions; /* Word boundary assertions */ /************************************************* /************************************************* /************************************************* /************************************************* /************************************************* /************************************************* 1. This software is distributed in the hope that it will be useful, 2. The origin of this software must not be misrepresented, either by 3. Altered versions must be plainly marked as such, and must not be 4. If PCRE is embedded in any software that is released under the GNU 5.005. If there is an options reset, it will get obeyed in the normal 5.005. If there is an options reset, it will get obeyed in the normal 6 : 3 + (ecode[1] << 8) + ecode[2]), < -1 => some kind of unexpected problem = 0 => success, but offsets is not big enough Arguments: Arguments: Arguments: Arguments: BOOL anchored; BOOL cur_is_word = (eptr < md->end_subject) && BOOL cur_is_word = (eptr < md->end_subject) && BOOL is_subject; BOOL minimize = FALSE; BOOL prev_is_word = (eptr != md->start_subject) && BOOL prev_is_word = (eptr != md->start_subject) && BOOL rc; BOOL startline; BOOL using_temporary_offsets = FALSE; Copyright (c) 1997-2000 University of Cambridge DPRINTF ((">>>> returning %d\n", match_block.errorcode)); DPRINTF ((">>>> returning %d\n", rc)); DPRINTF (("Copied offsets from temporary memory\n")); DPRINTF (("Freeing temporary memory\n")); DPRINTF (("Freeing temporary memory\n")); DPRINTF (("Got memory to hold back references\n")); DPRINTF (("Unknown opcode %d\n", *ecode)); DPRINTF (("bracket %d failed\n", number)); DPRINTF (("bracket 0 failed\n")); DPRINTF (("ims reset to %02lx\n", ims)); DPRINTF (("ims set to %02lx at group repeat\n", ims)); DPRINTF (("ims set to %02lx\n", ims)); DPRINTF (("matching %c{%d,%d} against subject %.*s\n", c, min, max, DPRINTF (("negative matching %c{%d,%d} against subject %.*s\n", c, min, max, DPRINTF (("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); DPRINTF (("start bracket 0\n")); GETCHAR (c, eptr) /* Get character */ GETCHARINC (c, eptr) /* Get character; increment eptr */ GETCHARINC (c, eptr) /* Get character; increment eptr */ General Purpose Licence (GPL), then the terms of that licence shall However, if the referenced string is the empty string, always treat If the bracket fails to match, we need to restore this value and also the If there isn't enough space in the offset vector, treat this as if it were a MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Otherwise, we can use the vector supplied, rounding down its size to a multiple Permission is granted to anyone to use this software for any purpose on any REPEATCHAR: REPEATNOTCHAR: REPEATTYPE: Returns: > 0 => success; value is the number of elements filled in Returns: TRUE if matched Returns: TRUE if matched Returns: nothing They are not both allowed to be zero. */ This is a library of functions to support regular expressions whose syntax This is the forcible breaking of infinite loops as implemented in Perl This is the forcible breaking of infinite loops as implemented in Perl Writing separate code makes it go faster, as does using an autoincrement and Written by: Philip Hazel a move back into the brackets. Check the alternative branches in turn - the address of eptr, so that eptr can be a register variable. */ an assertion "group", stop matching and return TRUE, but record the an empty string - recursion will then try other alternatives, if any. */ an error. Save the top 15 values on the stack, and accept that the rest an unanchored pattern, of course. If there's no first char and the pattern was analyzing most of the pattern. length > re->max_match_size is anchored = ((re->options | options) & PCRE_ANCHORED) != 0; and advance one byte in the pattern code. */ and reinstate them after the recursion. However, we don't know how many and semantics are as close as possible to those of the Perl 5 language. See and the required character in fact is caseful. */ at run time, so we have to test for anchoring. The first char may be unset for avoid duplicate testing (which takes significant time). This covers the vast backing off on a match. */ bmtable = extra->data.bmtable; both cases of the character. Otherwise set the two values the same, which will bracketed group and go to there. */ brackets - for testing for empty matches brackets started but not finished, we have to save their starting points break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; but WITHOUT ANY WARRANTY; without even the implied warranty of c != md->lcc[*eptr++]) c = *ecode++ - OP_CRSTAR; c = *ecode++ - OP_CRSTAR; c = *ecode++ - OP_NOTSTAR; c = *ecode++ - OP_STAR; c = *ecode++ - OP_TYPESTAR; c = *ecode++; c = *ecode++; c = *eptr++; c = 15; c = max - min; c = md->end_subject - eptr; c = md->lcc[c]; c = md->lcc[c]; c = md->offset_max; c == md->lcc[*eptr++]) can't just fail here, because of the possibility of quantifiers with zero case OP_ALT: case OP_ANY: case OP_ANY: case OP_ANY: case OP_ANY: case OP_ASSERT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ASSERT_NOT: case OP_BEG_WORD: case OP_BRA: /* Non-capturing bracket: optimized */ case OP_BRAMINZERO: case OP_BRANUMBER: case OP_BRAZERO: case OP_CHARS: case OP_CIRC: case OP_CLASS: case OP_COND: case OP_CREF: case OP_CRMINPLUS: case OP_CRMINPLUS: case OP_CRMINQUERY: case OP_CRMINQUERY: case OP_CRMINRANGE: case OP_CRMINRANGE: case OP_CRMINSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRPLUS: case OP_CRQUERY: case OP_CRQUERY: case OP_CRRANGE: case OP_CRRANGE: case OP_CRSTAR: case OP_CRSTAR: case OP_DIGIT: case OP_DIGIT: case OP_DIGIT: case OP_DIGIT: case OP_DOLL: case OP_END: case OP_END_WORD: case OP_EOD: case OP_EODN: case OP_EXACT: case OP_KET: case OP_KETRMAX: case OP_KETRMIN: case OP_MINPLUS: case OP_MINQUERY: case OP_MINSTAR: case OP_MINUPTO: case OP_NOT: case OP_NOTEXACT: case OP_NOTMINPLUS: case OP_NOTMINQUERY: case OP_NOTMINSTAR: case OP_NOTMINUPTO: case OP_NOTPLUS: case OP_NOTQUERY: case OP_NOTSTAR: case OP_NOTUPTO: case OP_NOT_DIGIT: case OP_NOT_DIGIT: case OP_NOT_DIGIT: case OP_NOT_DIGIT: case OP_NOT_WHITESPACE: case OP_NOT_WHITESPACE: case OP_NOT_WHITESPACE: case OP_NOT_WHITESPACE: case OP_NOT_WORDCHAR: case OP_NOT_WORDCHAR: case OP_NOT_WORDCHAR: case OP_NOT_WORDCHAR: case OP_NOT_WORD_BOUNDARY: case OP_ONCE: case OP_OPT: case OP_PLUS: case OP_QUERY: case OP_RECURSE: case OP_REF: case OP_REVERSE: case OP_SOD: case OP_STAR: case OP_TYPEEXACT: case OP_TYPEMINPLUS: case OP_TYPEMINQUERY: case OP_TYPEMINSTAR: case OP_TYPEMINUPTO: case OP_TYPEPLUS: case OP_TYPEQUERY: case OP_TYPESTAR: case OP_TYPEUPTO: case OP_UPTO: case OP_WHITESPACE: case OP_WHITESPACE: case OP_WHITESPACE: case OP_WHITESPACE: case OP_WORDCHAR: case OP_WORDCHAR: case OP_WORDCHAR: case OP_WORDCHAR: case OP_WORD_BOUNDARY: case matching may be when this character is hit, so test for it in both its caselessly, or if there are any changes of this flag within the regex, set up cases if necessary. However, the different cased versions will not be set up character" set. If the PCRE_CASELESS is set, implying that the match starts characters and work backwards. */ characters and work backwards. */ code for maximizing the speed, and do the type test once at the start code to character type repeats - written out again for speed. */ commoning these up that doesn't require a test of the positive/negative computer system, and to redistribute it freely, subject to the following const char *subject; const pcre *re; const pcre_extra *extra; const uschar *bmtable = NULL; const uschar *data = ecode + 1; /* Save for matching */ const uschar *end_subject; const uschar *next = ecode + 1; const uschar *next = ecode + 1; const uschar *p = md->start_subject + md->offset_vector[offset]; const uschar *p; const uschar *pp = eptr; const uschar *pp = eptr; const uschar *pp = eptr; const uschar *pp = eptr; const uschar *pp = eptr; const uschar *pp = eptr; const uschar *pp = eptr; const uschar *prev = ecode - (ecode[1] << 8) - ecode[2]; const uschar *prev = ecode; const uschar *req_char_ptr = start_match - 1; const uschar *saved_eptr = eptr; const uschar *saved_eptr = eptrb->saved_eptr; const uschar *saved_eptr; const uschar *start_bits = NULL; const uschar *start_match = (const uschar *) subject + start_offset; continue; /* With the main loop */ continue; continue; continue; continue; continue; continue; continue; continue; continue; continue; continue; continue; continue; course of events. */ course of events. */ ctype = *ecode++; /* Code for the character type */ cur_is_word == prev_is_word : cur_is_word != prev_is_word) current high water mark for use by positive assertions. Do this also default: /* No repeat follows */ default: /* No repeat follows */ default: do do do do do do do do do do do each branch of a lookbehind assertion. If we are too close to the start to each substring: the offsets to the start and end of the substring. ecode position in code ecode + ((offset < offset_top && md->offset_vector[offset] >= 0) ? ecode += (ecode[1] << 8) + ecode[2]; ecode += (ecode[1] << 8) + ecode[2]; ecode += (ecode[1] << 8) + ecode[2]; ecode += (ecode[1] << 8) + ecode[2]; ecode += (ecode[1] << 8) + ecode[2]; ecode += (ecode[1] << 8) + ecode[2]; ecode += (ecode[1] << 8) + ecode[2]; ecode += (ecode[1] << 8) + ecode[2]; ecode += (ecode[1] << 8) + ecode[2]; ecode += (ecode[1] << 8) + ecode[2]; ecode += 2; ecode += 2; ecode += 3 + (ecode[4] << 8) + ecode[5]; ecode += 33; /* Advance past the item */ ecode += 3; /* Advance past the item */ ecode += 3; ecode += 3; ecode += 3; ecode += 3; ecode += 3; ecode += 3; ecode += 3; ecode += 3; ecode += 3; ecode += 3; ecode += 3; ecode += 3; ecode += 5; ecode += 5; ecode = next + 3; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; ecode++; else else else else else else else else else else else else else else else else else else else else else else else else else else else else else else else else else if ((extra->options & PCRE_STUDY_BM) != 0) else if (first_char >= 0) else if (start_bits != NULL) else if (startline) encountered */ end_subject = match_block.end_subject; eptr pointer in subject eptr points into the subject eptr += c; eptr += length; eptr += length; eptr += length; eptr += length; eptr += min; eptr -= (ecode[1] << 8) + ecode[2]; eptr -= length; eptr = md->end_match_ptr; eptr = md->end_match_ptr; eptr++; eptr++; eptr++; eptr++; eptr++; eptr++; eptr++; eptr++; eptr++; eptr++; eptr++; eptr++; eptrb pointer to chain of blocks containing eptr at start of eptrb = &newptrb; eptrb = eptrb->prev; /* Back up the stack of bracket start pointers */ eptrblock *eptrb; eptrblock newptrb; eptrblock; exactly what going to the ket would do. */ explicit claim or by omission. external_extra points to "hints" from pcre_study() or is NULL external_re points to the compiled expression extraction by setting the offsets and bumping the high water mark. */ first_char = match_block.lcc[first_char]; first_char = re->first_char; flags can contain for (;;) for (i = 1; i <= c; i++) for (i = 1; i <= c; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = 1; i <= min; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min; i < max; i++) for (i = min;; i++) for (i = min;; i++) for (i = min;; i++) for (i = min;; i++) for (i = min;; i++) for (i = min;; i++) for (i = min;; i++) for the "once" (not-backup up) groups. */ for the match to succeed. If the first character is set, req_char must be found it, so that we don't search again next time round the loop if from a previous iteration of this group, and be referred to by a reference goto REPEATCHAR; goto REPEATCHAR; goto REPEATNOTCHAR; goto REPEATNOTCHAR; goto REPEATTYPE; goto REPEATTYPE; group number back at the start and if necessary complete handling an happens for a repeating ket if no characters were matched in the group. happens for a repeating ket if no characters were matched in the group. here; that is handled in the code for KET. */ hold, we get a temporary bit of working store to use during the matching. i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper if (!anchored) if (!match (start_match, re->code, 2, &match_block, ims, NULL, match_isgroup)) if (!match_ref (offset, eptr, length, md, ims)) if (!match_ref (offset, eptr, length, md, ims)) if (!match_ref (offset, eptr, length, md, ims)) if (!md->endonly) if (!rc) if (!startline && extra != NULL) if ((*ecode++ == OP_WORD_BOUNDARY) ? if ((data[c / 8] & (1 << (c & 7))) != 0) if ((data[c / 8] & (1 << (c & 7))) != 0) if ((data[c / 8] & (1 << (c & 7))) == 0) if ((extra->options & PCRE_STUDY_MAPPED) != 0) if ((flags & match_condassert) != 0) if ((flags & match_condassert) != 0) if ((flags & match_isgroup) != 0) if ((ims & PCRE_CASELESS) != 0) if ((ims & PCRE_CASELESS) != 0) if ((ims & PCRE_CASELESS) != 0) if ((ims & PCRE_CASELESS) != 0) if ((ims & PCRE_CASELESS) != 0) if ((ims & PCRE_CASELESS) != 0) if ((ims & PCRE_CASELESS) != 0) if ((ims & PCRE_DOTALL) == 0 && c == '\n') if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == '\n') if ((ims & PCRE_DOTALL) == 0) if ((ims & PCRE_DOTALL) == 0) if ((ims & PCRE_MULTILINE) != 0) if ((ims & PCRE_MULTILINE) != 0) if ((md->ctypes[*eptr++] & ctype_digit) != 0) if ((md->ctypes[*eptr++] & ctype_digit) == 0) if ((md->ctypes[*eptr++] & ctype_space) != 0) if ((md->ctypes[*eptr++] & ctype_space) == 0) if ((md->ctypes[*eptr++] & ctype_word) != 0) if ((md->ctypes[*eptr++] & ctype_word) == 0) if ((md->ctypes[c] & ctype_digit) != 0) if ((md->ctypes[c] & ctype_digit) == 0) if ((md->ctypes[c] & ctype_space) != 0) if ((md->ctypes[c] & ctype_space) == 0) if ((md->ctypes[c] & ctype_word) != 0) if ((md->ctypes[c] & ctype_word) == 0) if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) if ((re->options & PCRE_FIRSTSET) != 0) if ((re->options & PCRE_REQCHSET) != 0) if ((start_bits[c / 8] & (1 << (c & 7))) == 0) if (*ecode != OP_ONCE && *ecode != OP_ALT) if (*ecode == OP_KET || eptr == saved_eptr) if (*ecode == OP_KET || eptr == saved_eptr) if (*ecode == OP_KET) if (*ecode == OP_KETRMIN) if (*ecode == OP_KETRMIN) if (*ecode++ != *eptr++) if (*ecode++ == *eptr++) if (*eptr != '\n') if (*eptr++ == '\n') if (*p++ != *eptr++) if (*p++ == req_char) if (*prev != OP_COND) if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT || if (bmtable != NULL) if (bmtable[*start_match]) if (c != *eptr++) if (c != md->lcc[*eptr++]) if (c < 16) if (c == *eptr++) if (c == md->lcc[*eptr++]) if (c > md->end_subject - eptr) if (cur_is_word == prev_is_word || if (ecode[3] == OP_CREF) /* Condition is extraction test */ if (ecode[3] == OP_OPT) if (eptr != md->start_subject && eptr[-1] != '\n') if (eptr != md->start_subject) if (eptr < md->end_subject - 1 || if (eptr < md->end_subject - 1 || if (eptr < md->end_subject) if (eptr < md->end_subject) if (eptr < md->start_subject) if (eptr >= md->end_subject || if (eptr >= md->end_subject || if (eptr >= md->end_subject || if (eptr >= md->end_subject || if (eptr >= md->end_subject || if (eptr >= md->end_subject || if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0) if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0) if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0) if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0) if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0) if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0) if (eptr >= md->end_subject || *eptr == '\n') if (eptr >= md->end_subject || c != *eptr) if (eptr >= md->end_subject || c != md->lcc[*eptr]) if (eptr >= md->end_subject || c == *eptr) if (eptr >= md->end_subject || c == md->lcc[*eptr]) if (eptr >= md->end_subject) if (eptr >= md->end_subject) if (eptr >= md->end_subject) if (eptr >= md->end_subject) if (eptr >= md->end_subject) if (eptr++ >= md->end_subject) if (i >= max || !match_ref (offset, eptr, length, md, ims)) if (i >= max || eptr >= md->end_subject || if (i >= max || eptr >= md->end_subject || if (i >= max || eptr >= md->end_subject || c != *eptr++) if (i >= max || eptr >= md->end_subject || c == *eptr++) if (i >= max || eptr >= md->end_subject) if (i >= max || eptr >= md->end_subject) if (is_subject && length > md->end_subject - p) if (isprint (c = *(p++))) if (length == 0) if (length > md->end_subject - eptr) if (length > md->end_subject - eptr) if (match (eptr, ecode + 3, offset_top, md, ims, NULL, if (match (eptr, ecode + 3, offset_top, md, ims, NULL, match_isgroup)) if (match (eptr, ecode + 3, offset_top, md, ims, NULL, match_isgroup)) if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, 0) || if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, 0) || if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, match_isgroup)) if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, match_isgroup)) if (match (eptr, ecode + 3, offset_top, md, ims, eptrb, match_isgroup)) if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr, next + 3, offset_top, md, ims, eptrb, match_isgroup)) if (match (eptr, next, offset_top, md, ims, eptrb, match_isgroup)) if (match (eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || if (match (eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) if (match (eptr--, ecode, offset_top, md, ims, eptrb, 0)) if (match_block.end_offset_top > offsetcount) if (match_block.offset_vector != NULL) if (match_block.offset_vector == NULL) if (max == 0) if (max == 0) if (max == 0) if (max == 0) if (max == 0) if (max == 0) if (max == 0) if (md->lcc[*ecode++] != md->lcc[*eptr++]) if (md->lcc[*ecode++] == md->lcc[*eptr++]) if (md->lcc[*p++] != md->lcc[*eptr++]) if (md->notbol && eptr == md->start_subject) if (md->notempty && eptr == md->start_match) if (md->noteol) if (md->noteol) if (min == max) if (min == max) if (min == max) if (min == max) if (min == max) if (min == max) if (min == max) if (min > 0) if (min > md->end_subject - eptr) if (min > md->end_subject - eptr) if (min > md->end_subject - eptr) if (minimize) if (minimize) if (minimize) if (minimize) if (minimize) if (minimize) if (minimize) if (number > 0) if (number > EXTRACT_BASIC_MAX) if (number > EXTRACT_BASIC_MAX) if (offset < md->offset_max) if (offset >= md->offset_max) if (offset_top <= offset) if (offsetcount < 2) if (offsetcount >= 4) if (op > OP_BRA) if (p > req_char_ptr) if (p >= end_subject) if (pp == req_char || pp == req_char2) if (re == NULL || subject == NULL || if (re->magic_number != MAGIC_NUMBER) if (re->max_match_size >= 0 if (re->top_backref > 0 && re->top_backref >= ocount / 3) if (req_char == req_char2) if (req_char >= 0) if (resetcount > offsetcount) if (save != stacksave) if (save == NULL) if (skipped_chars) if (start_match + bmtable[256] > end_subject) if (start_match > match_block.start_subject + start_offset) if (using_temporary_offsets) if (using_temporary_offsets) if certain parts of the pattern were not used. */ if the malloc fails ... there is no way of returning to the top level with implied in the second condition, because start_offset > 0. */ ims current /i, /m, and /s options ims the ims flags ims = (ims & ~PCRE_IMS) | ecode[4]; ims = ecode[1]; ims = original_ims; ims = re->options & (PCRE_CASELESS | PCRE_MULTILINE | PCRE_DOTALL); in the pattern. */ in the subject string, while eptrb holds the value of eptr at the start of the initialize them to avoid reading uninitialized locations. */ inline, and there are *still* stupid compilers about that don't like indented inside the group. int int *offsets; int *save; int c; int first_char = -1; int flags; int length; int length; int length; int length; int min, max, ctype; int number = *prev - OP_BRA; int number = op - OP_BRA; int offset = (ecode[1] << 9) | (ecode[2] << 1); /* Doubled reference number */ int offset = (ecode[4] << 9) | (ecode[5] << 1); /* Doubled reference number */ int offset; int offset; int offset; int offset_top; int offsetcount; int op = (int) *ecode; int options; int rc; int req_char = -1; int req_char2 = -1; int resetcount, ocount; int save_offset1 = md->offset_vector[offset]; int save_offset2 = md->offset_vector[offset + 1]; int save_offset3 = md->offset_vector[md->offset_end - number]; int skipped_chars = 0; int stacksave[15]; int start_offset; is a bit large to put on the stack, but using malloc for small numbers is_subject TRUE if printing from within md->start_subject it as matched, any number of times (otherwise there could be infinite item to see if there is repeat information following. The code is similar item to see if there is repeat information following. Then obey similar last bracketed group - used for breaking infinite loops matching zero-length later in the subject; otherwise the test starts at the match point. This length length of subject string (may contain binary zeros) length length to be matched length number to print length = (offset >= offset_top || md->offset_vector[offset] < 0) ? length = md->end_subject - p; level without recursing. Otherwise, if minimizing, keep trying the rest of level without recursing. Otherwise, if minimizing, keep trying the rest of loop. */ loops). */ main loop. */ majority of cases. It will be suboptimal when the case flag changes in a regex mark, since extracts may have been taken during the assertion. */ mark, since extracts may have been taken. */ match (eptr, ecode + 3, offset_top, md, ims, eptrb, 0)) match (eptr, ecode + 3, offset_top, md, ims, eptrb, 0)) match (eptr, ecode, offset_top, md, ims, eptrb, flags) match (eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) match (eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) match_block.ctypes = re->tables + ctypes_offset; match_block.end_subject = match_block.start_subject + length; match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; match_block.errorcode = PCRE_ERROR_NOMATCH; /* Default error */ match_block.errorcode == PCRE_ERROR_NOMATCH && match_block.lcc = re->tables + lcc_offset; match_block.lcc[*start_match] != first_char) match_block.notbol = (options & PCRE_NOTBOL) != 0; match_block.notempty = (options & PCRE_NOTEMPTY) != 0; match_block.noteol = (options & PCRE_NOTEOL) != 0; match_block.offset_end = ocount; match_block.offset_max = (2 * ocount) / 3; match_block.offset_overflow = FALSE; match_block.offset_overflow = TRUE; match_block.offset_vector = (int *) (pcre_malloc) (ocount * sizeof (int)); match_block.offset_vector = offsets; match_block.start_match = start_match; match_block.start_pattern = re->code; match_block.start_subject = (const uschar *) subject; match_condassert - this is an assertion condition match_condassert | match_isgroup)) match_data *md; match_data *md; match_data *md; match_data match_block; match_isgroup - this is the start of a bracketed group match_isgroup); match_ref (offset, eptr, length, md, ims) matches, we carry on as at the end of a normal bracket, leaving the subject matching won't pass the KET for an assertion. If any one branch matches, matching won't pass the KET for this kind of subpattern. If any one branch max = (ecode[1] << 8) + ecode[2]; max = (ecode[1] << 8) + ecode[2]; max = (ecode[1] << 8) + ecode[2]; max = (ecode[3] << 8) + ecode[4]; max = (ecode[3] << 8) + ecode[4]; max = INT_MAX; max = INT_MAX; max = INT_MAX; max = INT_MAX; max = INT_MAX; max = INT_MAX; max = INT_MAX; max = rep_max[c]; /* zero for max => infinity */ max = rep_max[c]; /* zero for max => infinity */ max = rep_max[c]; /* zero for max => infinity */ max = rep_max[c]; /* zero for max => infinity */ max = rep_max[c]; /* zero for max => infinity */ max, eptr)); max, eptr)); maximum. Alternatively, if maximizing, find the maximum number of maximum. Alternatively, if maximizing, find the maximum number of may be wrong. */ md pointer to "static" info for the match md pointer to matching data block, if is_subject is TRUE md points to match data block md->end_match_ptr = eptr; /* For ONCE */ md->end_match_ptr = eptr; /* Record where we ended */ md->end_offset_top = offset_top; /* and how many extracts were taken */ md->end_offset_top = offset_top; md->end_subject - eptr + 1 : md->errorcode = PCRE_ERROR_UNKNOWN_NODE; md->offset_overflow = TRUE; md->offset_vector[md->offset_end - i] = save[i]; md->offset_vector[md->offset_end - number] = eptr - md->start_subject; md->offset_vector[md->offset_end - number] = save_offset3; md->offset_vector[md->offset_end - number]; md->offset_vector[offset + 1] - md->offset_vector[offset]; md->offset_vector[offset + 1] = eptr - md->start_subject; md->offset_vector[offset + 1] = save_offset2; md->offset_vector[offset] = md->offset_vector[offset] = save_offset1; memcpy (offsets + 2, match_block.offset_vector + 2, min = (ecode[1] << 8) + ecode[2]; min = (ecode[1] << 8) + ecode[2]; min = 0; min = 0; min = 0; min = max = (ecode[1] << 8) + ecode[2]; min = max = (ecode[1] << 8) + ecode[2]; min = max = (ecode[1] << 8) + ecode[2]; min = max = 1; min = rep_min[c]; /* Pick up values from tables; */ min = rep_min[c]; /* Pick up values from tables; */ min = rep_min[c]; /* Pick up values from tables; */ min = rep_min[c]; /* Pick up values from tables; */ min = rep_min[c]; /* Pick up values from tables; */ minima. */ minimize = (*ecode == OP_CRMINRANGE); minimize = (*ecode == OP_CRMINRANGE); minimize = (c & 1) != 0; minimize = (c & 1) != 0; minimize = (c & 1) != 0; minimize = (c & 1) != 0; minimize = (c & 1) != 0; minimize = *ecode == OP_MINUPTO; minimize = *ecode == OP_NOTMINUPTO; minimize = *ecode == OP_TYPEMINUPTO; minimize = TRUE; minimum number of matches are present. If min = max, continue at the same minimum number of matches are present. If min = max, continue at the same misrepresented as being the original software. move back, this match function fails. */ mustn't change the current values of the data slot, because they may be set need to recurse. */ never be used unless previously set, but they get saved and restored, and so we never set for an anchored regular expression, but the anchoring may be forced newline unless endonly is set, else end of subject unless noteol is set. */ newptrb.prev = eptrb; newptrb.saved_eptr = eptr; next += (next[1] << 8) + next[2]; next += (next[1] << 8) + next[2]; non-capturing bracket. Don't worry about setting the flag for the error case number = (ecode[4] << 8) | ecode[5]; number = (prev[4] << 8) | prev[5]; number from a dummy opcode at the start. */ number, then move along the subject till after the recursive match, ocount = offsetcount - (offsetcount % 3); ocount = re->top_backref * 3 + 3; of (?ims) items in the pattern. They are kept in a local variable so that of 3. */ of subject left; this ensures that every attempt at a match fails. We offset index into the offset vector offset = number << 1; offset = number << 1; offset_top current top pointer offset_top = md->end_offset_top; offset_top = md->end_offset_top; offset_top = md->end_offset_top; offset_top = offset + 2; offset_top, md, ims, eptrb, match_isgroup); offsetcount the number of elements in the vector offsets points to a vector of ints to be filled in with offsets offsets[0] = start_match - match_block.start_subject; offsets[1] = match_block.end_match_ptr - match_block.start_subject; op = OP_BRA; opcode. */ optimization can save a huge amount of backtracking in patterns with nested option for each character match. Maybe that wouldn't add very much to the options option bits p points to characters p--; p--; past the end if there is only one branch, but that's OK because that is pchars (ecode, length, FALSE, md); pchars (eptr, 16, TRUE, md); pchars (eptr, length, TRUE, md); pchars (eptr, length, TRUE, md); pchars (p, length, FALSE, md); pchars (p, length, is_subject, md) pchars (start_match, end_subject - start_match, TRUE, &match_block); pcre_exec (re, extra, subject, length, start_offset, options, offsets, offsetcount) place we found it at last time. */ pointer. */ portions of the string if it matches. Two elements in the vector are set for pre-processor statements. I suppose it's only been 10 years... */ preceded by BRAZERO or BRAMINZERO. */ preceding bracket, in the appropriate order. */ preceding bracket, in the appropriate order. We need to reset any options printf (" against backref "); printf (" against pattern "); printf ("%c", c); printf (">>>> Match against: "); printf (">>>>> Skipped %d chars to reach first character\n", printf ("\\x%02x", c); printf ("\n"); printf ("\n"); printf ("\n"); printf ("\n"); printf ("\n"); printf ("end bracket %d", number); printf ("matching subject "); printf ("matching subject "); printf ("matching subject against pattern "); printf ("matching subject "); printf ("start bracket %d subject=", number); rc = 0; rc = match (eptr, md->start_pattern, offset_top, md, ims, eptrb, rc = match_block.offset_overflow ? 0 : match_block.end_offset_top / 2; register const uschar *ecode; register const uschar *eptr; register const uschar *eptr; register const uschar *p = start_match + ((first_char >= 0) ? 1 : 0); register int *iend = iptr + resetcount; register int *iend = iptr - resetcount / 2 + 1; register int *iptr = match_block.offset_vector + ocount; register int *iptr = match_block.offset_vector; register int c = *start_match; register int c; register int i; register int length = ecode[1]; register int pp = *p++; repeat it in the interests of efficiency. */ repeat limits are compiled as a number of copies, with the optional ones req_char = re->req_char; req_char2 = ((re->options & (PCRE_CASELESS | PCRE_ICHANGED)) != 0) ? req_char_ptr = p; resetcount = 2 + re->top_bracket * 2; resetcount = ocount; restoring at the exit of a group is easy. */ restrictions: return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return FALSE; return PCRE_ERROR_BADMAGIC; return PCRE_ERROR_BADOPTION; return PCRE_ERROR_NOMATCH; return PCRE_ERROR_NOMEMORY; return PCRE_ERROR_NULL; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return TRUE; return match (eptr, return match (eptr, ecode + 3, offset_top, md, ims, eptrb, match_isgroup); return match_block.errorcode; return rc; save = (int *) (pcre_malloc) ((c + 1) * sizeof (int)); save = stacksave; save = stacksave; save[i] = md->offset_vector[md->offset_end - i]; seems expensive. As a compromise, the stack is used when there are fewer share code. This is very similar to the code for single characters, but we similar code to character type repeats - written out again for speed. since matching characters is likely to be quite common. First, ensure the since matching characters is likely to be quite common. First, ensure the skipped_chars += bmtable[*start_match], skipped_chars += bmtable[256] - 1; skipped_chars -= bmtable[256] - 1; skipped_chars); skipped_chars++, skipped_chars++, skipped_chars++, skipped_chars++, stack of such pointers, to be re-instated at the end of the group when we hit stack, for holding the values of the subject pointer at the start of each start of each branch to move the current point backwards, so the code at start_bits = extra->data.start_bits; start_match += bmtable[*start_match]; start_match += bmtable[256] - 1; start_match -= bmtable[256] - 1; start_match = (const uschar *) subject + length - re->max_match_size; start_match++ < end_subject); start_match++; start_match++; start_match++; start_match++; start_offset where to start in the subject string startline = (re->options & PCRE_STARTLINE) != 0; static BOOL static BOOL static const char rep_max[] = static const char rep_min[] = static void strings. struct eptrblock *prev; studied, there may be a bitmap of possible first characters. */ subject points to the subject string subject if the requested. subpattern - to break infinite loops. */ subpattern, so as to detect when an empty string has been matched by a subsequent match. */ such there are (offset_top records the completed total) so we just have supersede any condition above with which it is incompatible. switch (*ecode) switch (*ecode) switch (ctype) switch (ctype) switch (ctype) switch (op) test once at the start (i.e. keep it out of the loop). */ than 16 values to store; otherwise malloc is used. A problem is what to do than the number of characters left in the string, so the match fails. that "continue" in the code above comes out to here to repeat the main that changed within the bracket before re-running it, so check the next that it may occur zero times. It may repeat infinitely, or not at all - the assertion is true. Lookbehind assertions have an OP_REVERSE item at the the closing ket. When match() is called in other circumstances, we don't add to the code for a repeated single character, but I haven't found a nice way of the current subject position in the working slot at the top of the vector. We the expression and advancing one matching character if failing, up to the the expression and advancing one matching character if failing, up to the the external pcre header. */ the file Tech.Notes for some information on the internals. the final argument TRUE causes it to stop at the end of an assertion. */ the group. */ the length of the reference string explicitly rather than passing the the loop runs just once. */ the minimum number of bytes before we start. */ the number from a dummy opcode at the start. */ the point in the subject string is not moved back. Thus there can never be the pointer while it matches the class. */ the same bracket. the stack. */ the start hasn't passed this character yet. */ the subject. */ the subject. */ there were too many extractions, set the return code to zero. In the case this level is identical to the lookahead case. */ this makes a huge difference to execution time when there aren't many brackets those back references that we can. In this case there need not be overflow time taken, but character matching *is* what this is all about... */ to save all the potential data. There may be up to 99 such values, which to that for character classes, but repeated for efficiency. Then obey two branches. If the condition is false, skipping the first branch takes us typedef struct eptrblock unless PCRE_CASELESS was given or the casing state changes within the regex. unlimited repeats that aren't going to match. We don't know what the state of unsigned long int ims = 0; unsigned long int ims; unsigned long int ims; unsigned long int original_ims = ims; /* Save for resetting on ')' */ up quickly if there are fewer than the minimum number of characters left in up quickly if there are fewer than the minimum number of characters left in using_temporary_offsets = TRUE; values of the final offsets, in case they were set by a previous iteration of we just need to set up the whole thing as substring 0 before returning. If where we had to get some local store to hold offsets for backreferences, copy while (!anchored && while (*ecode == OP_ALT) while (*ecode == OP_ALT); while (*ecode == OP_ALT); while (*ecode == OP_ALT); while (*ecode == OP_ALT); while (*ecode == OP_ALT); while (*ecode == OP_ALT); while (*ecode == OP_ALT); while (*ecode == OP_ALT); while (*next == OP_ALT); while (*next == OP_ALT); while (--iptr >= iend) while (eptr >= pp) while (eptr >= pp) while (eptr >= pp) while (eptr >= pp) while (eptr >= pp) while (eptr >= pp) while (eptr >= pp) while (iptr < iend) while (length-- > 0) while (length-- > 0) while (length-- > 0) while (length-- > 0) while (length-- > 0) while (p < end_subject) while (p < end_subject) while (start_match < end_subject && while (start_match < end_subject && *start_match != first_char) while (start_match < end_subject && start_match[-1] != '\n') while (start_match < end_subject) while (start_match < end_subject) { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { {0, 0, 0, 0, 1, 1}; {0, 0, 1, 1, 0, 0}; } /* End of main loop */ } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } sed-3.62/testsuite/uniq.sed0000644000076600007660000000046510143133572012662 00000000000000h :b # On the last line, print and exit $b N /^\(.*\)\n\1$/ { # The two lines are identical. Undo the effect of # the n command. g bb } # If the @code{N} command had added the last line, print and exit $b # The lines are different; print the first and go # back working on the second. P D sed-3.62/testsuite/version.gin0000644000076600007660000000044310143133572013371 00000000000000super-sed version @VERSION@ based on GNU sed version 4.1 Copyright (C) 2003 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. sed-3.62/testsuite/writeout.inp0000644000076600007660000000022010143133572013570 00000000000000Facts are simple and facts are straight Facts are lazy and facts are late Facts all come with points of view Facts don't do what I want them to sed-3.62/testsuite/writeout.sed0000644000076600007660000000003310143133572013557 00000000000000/^Facts ar/w writeout.wout sed-3.62/testsuite/wrtout1.good0000644000076600007660000000022010143133572013475 00000000000000Facts are simple and facts are straight Facts are lazy and facts are late Facts all come with points of view Facts don't do what I want them to sed-3.62/testsuite/wrtout2.good0000644000076600007660000000011210143133572013476 00000000000000Facts are simple and facts are straight Facts are lazy and facts are late sed-3.62/testsuite/xabcx.good0000644000076600007660000000010210143133572013154 00000000000000roses are red violets are blue my feet are cold your feet are too sed-3.62/testsuite/xabcx.inp0000644000076600007660000000010310143133572013013 00000000000000roses are red violets are blue my feet are cold your feet are blue sed-3.62/testsuite/xabcx.sed0000644000076600007660000000007210143133572013005 00000000000000# from the ChangeLog (Fri May 21 1993) \xfeetxs/blue/too/ sed-3.62/testsuite/xbxcx.good0000644000076600007660000000004310143133572013207 00000000000000x xbx xbxcx xbxcx xbxcx xbxcx xbxcxsed-3.62/testsuite/xbxcx.inp0000644000076600007660000000003310143133572013044 00000000000000 b bc bac baac baaac baaaacsed-3.62/testsuite/xbxcx.sed0000644000076600007660000000005710143133572013037 00000000000000# from the ChangeLog (Wed Sep 5 2001) s/a*/x/g sed-3.62/testsuite/xbxcx3.good0000644000076600007660000000004110143133572013270 00000000000000 b bcx bacx baacx baaacx baaaacx sed-3.62/testsuite/xbxcx3.inp0000644000076600007660000000003410143133572013130 00000000000000 b bc bac baac baaac baaaac sed-3.62/testsuite/xbxcx3.sed0000644000076600007660000000001110143133572013110 00000000000000s/a*/x/3 sed-3.62/testsuite/xemacs.good0000644000076600007660000000504010143133572013335 00000000000000#Makefile.in generated automatically by automake 1.5 from Makefile.am. #Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 #Free Software Foundation, Inc. #This Makefile.in is free software; the Free Software Foundation #gives unlimited permission to copy and/or distribute it, #with or without modifications, as long as this notice is preserved. #This program is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY, to the extent permitted by law; without #even the implied warranty of MERCHANTABILITY or FITNESS FOR A #PARTICULAR PURPOSE. "@SET_MAKE@" #Automake requirements "SHELL = @SHELL@" "PACKAGE = sed" "EXTRA_DIST = BUGS THANKS README.boot bootstrap.sh dc.sed autogen \\" " m4/codeset.m4 m4/gettext.m4 m4/iconv.m4 m4/lcmessage.m4 \\" " m4/getline.m4 m4/glibc21.m4 m4/isc-posix.m4 m4/progtest.m4 \\" " m4/obstack.m4" "subdir = ." "ACLOCAL_M4 = $(top_srcdir)/aclocal.m4" "mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs" "CONFIG_HEADER = config.h" "CONFIG_CLEAN_FILES = bootstrap.sh intl/Makefile" "DIST_SOURCES =" "DATA = $(noinst_DATA)" "HEADERS = $(noinst_HEADERS)" "RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \\" " uninstall-info-recursive all-recursive install-data-recursive \\" " install-exec-recursive installdirs-recursive install-recursive \\" " uninstall-recursive check-recursive installcheck-recursive" "DIST_COMMON = README $(noinst_HEADERS) ./stamp-h.in ABOUT-NLS AUTHORS \\" " COPYING ChangeLog INSTALL Makefile.am Makefile.in NEWS THANKS \\" " TODO acconfig.h aclocal.m4 bootstrap.sh.in config.guess \\" " config.sub config_h.in configure configure.ac depcomp \\" " install-sh missing mkinstalldirs" "DIST_SUBDIRS = $(SUBDIRS)" "all: config.h" " $(MAKE) $(AM_MAKEFLAGS) all-recursive" ".SUFFIXES:" "$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4)" " cd $(top_srcdir) && \\" " $(AUTOMAKE) --gnu Makefile" "Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status" " cd $(top_builddir) && \\" " CONFIG_HEADERS= CONFIG_LINKS= \\" " CONFIG_FILES=$@ $(SHELL) ./config.status" "$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)" " $(SHELL) ./config.status --recheck" "$(srcdir)/configure: $(srcdir)/configure.ac $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)" " cd $(srcdir) && $(AUTOCONF)" "$(ACLOCAL_M4): configure.ac m4/codeset.m4 m4/getline.m4 m4/gettext.m4 m4/glibc21.m4 m4/iconv.m4 m4/isc-posix.m4 m4/lcmessage.m4 m4/obstack.m4 m4/progtest.m4" " cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)" "config.h: stamp-h"sed-3.62/testsuite/xemacs.inp0000644000076600007660000000471210143133572013200 00000000000000# Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Automake requirements SHELL = @SHELL@ PACKAGE = sed EXTRA_DIST = BUGS THANKS README.boot bootstrap.sh dc.sed autogen \ m4/codeset.m4 m4/gettext.m4 m4/iconv.m4 m4/lcmessage.m4 \ m4/getline.m4 m4/glibc21.m4 m4/isc-posix.m4 m4/progtest.m4 \ m4/obstack.m4 subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = bootstrap.sh intl/Makefile DIST_SOURCES = DATA = $(noinst_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ uninstall-info-recursive all-recursive install-data-recursive \ install-exec-recursive installdirs-recursive install-recursive \ uninstall-recursive check-recursive installcheck-recursive DIST_COMMON = README $(noinst_HEADERS) ./stamp-h.in ABOUT-NLS AUTHORS \ COPYING ChangeLog INSTALL Makefile.am Makefile.in NEWS THANKS \ TODO acconfig.h aclocal.m4 bootstrap.sh.in config.guess \ config.sub config_h.in configure configure.ac depcomp \ install-sh missing mkinstalldirs DIST_SUBDIRS = $(SUBDIRS) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$@ $(SHELL) ./config.status $(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.ac $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): configure.ac m4/codeset.m4 m4/getline.m4 m4/gettext.m4 m4/glibc21.m4 m4/iconv.m4 m4/isc-posix.m4 m4/lcmessage.m4 m4/obstack.m4 m4/progtest.m4 cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) config.h: stamp-hsed-3.62/testsuite/xemacs.sed0000644000076600007660000000031210143133572013155 00000000000000# Inspired by xemacs' config.status script # submitted by John Fremlin (john@fremlin.de) /^# Generated/d s%/\*\*/#.*%% s/^ *# */#/ /^##/d /^#/ { p d } /./ { s/\([\"]\)/\\\1/g s/^/"/ s/$/"/ }